一.異常語法
EXCEPTION
when exception1 [or exception2...] then
statement;...]
[when exception1 [or exception2...] then
statement;...]
[when others then
statement1;...]
二.預定義異常
(1)NO_DATA_FOUND
---根據僱員編號獲取僱員名
set serveroutput on; declare v_ename emp.ename%type; begin select ename into v_ename from emp where empno = &no; dbms_output.put_line('v_name is :'||v_ename); exception when no_data_found then dbms_output.put_line('empno is not exists.'); end;
(2)DUP_VAL_ON_INDEX
---更新dept表中的數據,導致主鍵重複
set serveroutput on; begin update dept set deptno=&newno where deptno=&oldno; exception when dup_val_on_index then dbms_output.put_line('primary key duplicat.'); end;
(3)TOO_MANY_ROWS
---獲取員工名的時候,使用查詢條件salary
set serveroutput on; declare v_ename emp.ename%type; begin select ename into v_ename from emp where sal=&v_sal; exception when too_many_rows then dbms_output.put_line('Return too many rows.'); end;
三.異常函數sqlcode,sqlerrm
---刪除errors表,如果存在 drop table errors purge; ---創建errors表結構 create table errors(error_id number ,program_name varchar2(50), error_code number ,error_message varchar2(100) ,create_date date default sysdate, constraint pk_errors primary key(error_id)); ---創建自增序列 create sequence seq_errors minvalue 1 maxvalue 999999999999999999999 start with 1 increment by 1 cache 20; ---使用sqlcode/sqlerrm函數把輸出錯誤到errors表 set serveroutput on; declare v_ename emp.ename%type; v_error_code number; v_error_message varchar2(100); begin select ename into v_ename from emp where sal=&v_sal; exception when others then v_error_code := sqlcode; v_error_message := substr(sqlerrm,1,100); insert into errors(error_id,program_name,error_code ,error_message) values(seq_errors.nextval,'anonymous block',v_error_code,v_error_message); commit; end;
四.raise_application_error
自定義錯誤輸出,錯誤號(error_numbert)必須大於20000
語法:
raise_application_error(error_number,error_message)
DECLARE num_tables NUMBER; BEGIN SELECT COUNT(*) INTO num_tables FROM USER_TABLES; IF num_tables < 1000 THEN raise_application_error(-20101, 'Expecting at least 1000 tables'); ELSE NULL; END IF; END;
五.自定義異常
定義異常--->顯示觸發異常--->引用例外
set serveroutput on; declare e_no_deptno exception; PRAGMA EXCEPTION_INIT(e_no_deptno,-2291); e_no_empno exception; begin update emp set deptno = &v_deptno where empno=&v_empno; if sql%notfound then raise e_no_empno; end if; exception when e_no_empno then dbms_output.put_line('empno is not exist.'); when e_no_deptno then dbms_output.put_line('deptno is not exist.'); end;