Oracle常用命令10 oracle例外處理

2021-05-25 01:54:49 字數 4787 閱讀 3541

【例外傳遞】

如果不處理例外我們看看會出現什麼情況:

案例,編寫乙個過程,可接收雇員的編號,並顯示該雇員的姓名。

問題是,如果輸入的雇員編號不存在,怎樣去處理呢?

--例外案例

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 辦事員 的姓名及其部門名稱,部門的人數.找出...