例外處理 PL SQL

2021-08-28 05:20:25 字數 4042 閱讀 7560

預定義例外【處理常見的oracle錯誤】

-- no_data_found

-- 編寫乙個塊,輸入雇員的編號,並顯示改雇員的姓名

-- 如果雇員的編號不存在,怎樣去處理?

declare

v_name varchar2(50);

begin

select ename into v_name from emp where empno=&emp_no;

dbms_output.put_line('雇員名是;'||v_name);

exception

when no_data_found then

dbms_output.put_line('輸入的編號不存在!');

end;

-- case_not_found

create or replace procedure case_pro(emp_no number) is

v_sal emp.sal%type;

begin

select sal into v_sal from emp where empno=emp_no;

case

when v_sal<1000 then

update emp set sal=sal+100 where empno=emp_no;

when v_sal<2000 then

update emp set sal=sal+200 where empno=emp_no;

end case;

exception

when case_not_found then

dbms_output.put_line('case語句沒有與'||v_sal||'匹配的條件!');

end;

-- cursor_already_open

declare

-- 定義游標變數

-- 第二種定義游標的方法

cursor emp_cursor is select ename,sal from emp;

begin

open emp_cursor;--第一次開啟游標

for emp_record in emp_cursor loop--第二次開啟游標

dbms_output.put_line(emp_record.ename);

end loop;

exception

when cursor_already_open then

dbms_output.put_line('游標已經開啟');

end;

-- dup_val_on_index

begin

insert into dept values(10,'公安部','北京');

exception

when dup_val_on_index then

dbms_output.put_line('在deptno列上不能出現重複值');

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);

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;

-- invalid_number

-- 當輸入的資料有誤時,會觸發該例外

-- 比如:數字100,寫成1oo就會觸發該例外

begin

update emp set sal=sal+'100' where empno=7788;

exception

when invalid_number 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(3);

begin

select ename into v_ename from emp where empno=&emp_no;

dbms_output.put_line(v_ename);

exception

when value_error then

dbms_output.put_line('變數尺寸不足');

end;

-- 1. 

-- login_denide

-- 當使用者非法登入時,會觸發該例外

-- 2.

-- not_logged_on

-- 如果使用者沒有登入就執行dml操作,就會觸發該例外

-- 3.

-- storage_error

-- 如果超出了記憶體空間或是記憶體被損壞,就觸發該例外

-- 4.

-- 如果oracle在等待資源時,出現了超時就觸發該例外

非預定義例外【處理預定義例外不能處理的例外】

自定義例外【處理與oracle錯誤無關的其它情況】

-- 編寫乙個塊,接收乙個雇員的編號,並給該雇員工資增加1000,

-- 如果該雇員不存在,請提示。

-- 自定義例外

-- 這裡是update和之前的select的no_data_found是不一樣的

create or replace procedure ex_test(emp_no number) is

-- 定義乙個例外

my_exception exception;

begin

update emp set sal=sal+1000 where empno=emp_no;

-- sql%notfound這是表示沒有update

-- raise my_exception;觸發my_exception例外

-- 什麼時候觸發

if sql%notfound then

raise my_exception;

end if;

-- 觸發時做什麼

exception

when my_exception then

dbms_output.put_line('沒有更新任何資料');

end;

PL SQL常用例外

oracle pl sql 例外處理 1 基本結構 begin 語句 exception 例外處理 when when others end 2 常用預定義例外 exception when cursor already open then ora 06511 sqlcode 6511 游標已經開啟...

PL SQL程式之例外

什麼是例外?例外是程式語言提供的一種功能,用來增強程式的健壯性和容錯性 oracle的異常處理 系統定義例外 no data found 沒有找到資料 too many rows select into語句匹配多個行 zero divide 被零除 value error 算術或轉換錯誤 timeo...

PL SQL 例外(異常) exception

異常是程式語言提供的一種功能,用來增強程式的健壯性和容錯性。1.系統定義異常 no data found 沒有找到資料 too many rows select into語句匹配多個行 zero divide 被零除 value error 算術或轉換錯誤 timeout on resource 在...