【例外傳遞】
如果不處理例外我們看看會出現什麼情況:
案例,編寫乙個過程,可接收雇員的編號,並顯示該雇員的姓名。
問題是,如果輸入的雇員編號不存在,怎樣去處理呢?
--例外案例
declare
--定義
v_ename emp.ename%type;
begin
--執行
select ename into v_ename from emp where empno=&gno;
dbms_output.put_line('名字:'||v_ename);
--no_data_found是預定義的例外,它認為這些例外很常見
when no_data_found then
dbms_output.put_line('編號沒有!');
end;
/【處理預定義例外】
預定義例外是由pl/sql所提供的系統例外。當pl/sql應用程式違反了oracle規定的
限制時,則會隱含的觸發乙個內部例外。pl/sql為開發人員提供了20多個預定義例外。
【預定義例外 case_not_found】
在開發pl/sql塊中編寫case語句時,如果在wehn子句中沒有包含必須的條件分支,就會
觸發case_not_found的例外:
create or replace procedure sp_pro6(spno number) is
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=spno;
case
when v_sal<1000 then
update emp set sal=sal+100 where empno=spno;
when v_sal<2000 then
update emp set sal=sal+200 where empno=spno;
end case;
exception
when case_not_found then
dbms_output.put_line('case語句沒有與'||v_sal||'相匹配的條件');
end;
/【預定義例外 cursor already_open】【貌似沒有效果啊】
當重新開啟已經開啟的游標時,會隱含的觸發例外cursor_already_open
declare
cursor emp_cursor is select ename,sal from emp;
begin
open emp_cursor;
for emp_record1 in emp_cursor loop
dbms_output.put_line(emp_record1.ename);
end loop;
exception
when cursor_already_open then
dbms_output.put_line('游標已經開啟');
end;
/【預定義例外 invalid_cursor】
當試圖在不合法的游標上執行操作時,會觸發該例外
例如:試圖從沒有開啟的游標提取資料,或是關閉沒有開啟的游標。則會觸發該例外
declare
cursor emp_cursor is select ename,sal from emp;
emp_record emp_cursor%rowtype;
begin
--open emp_cursor;--開啟游標
fetch emp_cursor into emp_record;
dbms_output.put_line(emp_record.ename);
close emp_cursor;
exception
when invalid_cursor then
dbms_output.put_line('請檢測游標是否開啟');
end;
/【預定義例外 invlide_number】
當輸入的資料有誤時,會觸發該例外
比如:數字100寫成了1oo就會觸發該例外
begin
update emp set sal=sal+'1oo';
exception
when invalid_number then
dbms_output.put_line('輸入的數字不正確');
end;
/【預定義例外 no_data_found】
下面是乙個pl/sql塊,當執行select into 沒有返回行,就會觸發該例外
declare
v_sal emp.sal%type;
begin
select sal into v_sal from emp where ename='&name';
exception
when no_data_found then
dbms_output.put_line('不存在該員工');
end;
【預定義例外 too_many_rows】
當執行select into 語句時,如果返回超過了一行,則會觸發該例外。
declare
v_ename emp.ename%type;
begin
select ename into v_ename from emp;
exception
when too_many_rows then
dbms_output.put_line('返回了多行');
end;
【預定義例外 zero_divide】
當執行 2/0 語句時,則會觸發該例外。
【預定義例外 value_error】
當在執行賦值操作時,如果變數的長度不足以容納實際資料,則會觸發該例外value_error,
比如:declare
v_ename varchar2(5);
begin
select ename into v_ename from emp where empno=&no1;
dbms_output.put_line(v_ename);
exception
when value_error then
dbms_output.put_line('變數尺寸不足');
end;
【其他預定義例外】
①login_denide
當使用者非法登入時,會觸發該例外
②not_logged_on
如果使用者沒有登入就執行dml操作,就會觸發該例外
③storage_error
如果超出了記憶體空間或是記憶體被損壞,就觸發該例外
④timeout_on_resource
如果oracle在等待資源時,出現了超時就觸發該例外
【非預定義例外】
非預定義例外用於處理與預定義例外無關的oracle錯誤。使用預定義例外
只能處理21個oracle錯誤,而當使用pl/sql開發應用程式時,可能會遇到
其他一些oracle錯誤。比如在pl/sql塊中執行dml語句時,違反了約束規定等
等,在這樣的情況下,也可以處理oracle的各種例外,因為非預定義例外用
的不多,這裡就不舉例了
【處理自定義例外】【oracle不認為是錯誤的,使用者可以自己將其定義為錯誤的】
預定義例外和自定義例外都是與oracle錯誤相關的,並且出現的oracle錯誤
會隱含的觸發相應的例外;而自定義例外與oracle錯誤沒有任何關聯,他是由
開發人員為特定情況所定義的例外。
?請編寫乙個pl/sql塊,接收乙個雇員的編號,並給該雇員工資增加1000元,
如果該雇員不存在,請提示。
create or replace procedure ex_test(spno number)
isbegin
--更新使用者sal
update emp set sal=sal+1000 where empno=spno;
end;
/@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 改進版 @@@@@@@@@@@@@@@@@@@@@@@@@@@@
create or replace procedure ex_test(spno number)
is--定義乙個例外
myex exception;
begin
--更新使用者sal
update emp set sal=sal+1000 where empno=spno;
--sql%notfound這是表示沒有update
--raise myex; 觸發myex例外
if sql%notfound then
raise myex;
end if;
exception
when myex then
dbms_output.put_line('沒有更新任何使用者');
end;
/【檢視】
檢視時乙個虛擬表,其內容有查詢定義。同真實的表一樣,檢視包含一系列帶有
名稱的列和行資料。但是,檢視並不在資料庫中以儲存的資料值集形式存在。
行和列資料來自由定義檢視的查詢所引用的表,並且在引用檢視時動態生成。
【檢視與表的區別】
①表需要占用磁碟空間,檢視不需要
②檢視不能新增索引
③使用檢視可以簡化複雜查詢
比如:學生選課系統
④使用檢視利於提高安全性
比如:不同使用者檢視不同檢視
Oracle常用命令10 oracle例外處理
例外傳遞 如果不處理例外我們看看會出現什麼情況 案例,編寫乙個過程,可接收雇員的編號,並顯示該雇員的姓名。問題是,如果輸入的雇員編號不存在,怎樣去處理呢?例外案例 declare 定義 v ename emp.ename type begin 執行 select ename into v ename...
Oracle 常用命令
1 檢視當前所有物件 sql select from tab 2 建乙個和a表結構一樣的空表 sql create table b as select from a where 1 2 sql create table b b1,b2,b3 as select a1,a2,a3 from a whe...
oracle常用命令
create insert delete select 建立使用者必須在sys超級管理員下 連線到超級管理員 conn sys as sysdba sys zhuangyan system zhuangyan scott tiger 查出所有 clerk 辦事員 的姓名及其部門名稱,部門的人數.找出...