PL学习-Exception
学习文档:
Compile-Time Warnings
PLSQL_WARNINGS
查看方法show parameters plsql
修改
PLSQL_WARNINGS = 'value_clause' [, 'value_clause' ] ... ALTER SESSION SET PLSQL_WARNINGS='ENABLE:ALL'; ALTER SESSION SET PLSQL_WARNINGS='ENABLE:PERFORMANCE'; ALTER SESSION SET PLSQL_WARNINGS='ENABLE:SEVERE', 'DISABLE:PERFORMANCE', 'ERROR:06002'; ALTER SESSION SET PLSQL_WARNINGS='DISABLE:ALL';
DBMS_WARNING
CALL DBMS_WARNING.set_warning_setting_string ('ENABLE:ALL', 'SESSION');
异常分类
| Category | Definer | Has Error Code | Has Name | Raised Implicitly | Raised Explicitly |
|
Internally defined |
Runtime system |
Always |
Only if you assign one |
Yes |
OptionallyFoot 1 |
|
Predefined |
Runtime system |
Always |
Always |
Yes |
OptionallyFootref 1 |
|
User-defined |
User |
Only if you assign one |
Always |
No |
Always |
内部定义
ORA-n error, 没有名字
如何让内部异常有名字
- 申明
exception_name EXCEPTION;
- 将error code同异常绑定
PRAGMA EXCEPTION_INIT (exception_name, error_code)
例子
DECLARE deadlock_detected EXCEPTION; PRAGMA EXCEPTION_INIT(deadlock_detected, -60); BEGIN ... EXCEPTION WHEN deadlock_detected THEN ... END; /
预定义
有名字的,预定义的
| Exception Name | Error Code |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DECLARE stock_price NUMBER := 9.73; net_earnings NUMBER := 0; pe_ratio NUMBER; BEGIN pe_ratio := stock_price / net_earnings; -- raises ZERO_DIVIDE exception DBMS_OUTPUT.PUT_LINE('Price/earnings ratio = ' || pe_ratio); EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('Company had zero earnings.'); pe_ratio := NULL; END; /
用户定义
exception_name EXCEPTION;
抛出异常
raise 语句
CREATE PROCEDURE account_status ( due_date DATE, today DATE ) AUTHID DEFINER IS past_due EXCEPTION; -- declare exception BEGIN IF due_date < today THEN RAISE past_due; -- explicitly raise exception END IF; EXCEPTION WHEN past_due THEN -- handle exception DBMS_OUTPUT.PUT_LINE ('Account past due.'); END; / BEGIN account_status (TO_DATE('01-JUL-2010', 'DD-MON-YYYY'), TO_DATE('09-JUL-2010', 'DD-MON-YYYY')); END; /
RAISE_APPLICATION_ERROR
RAISE_APPLICATION_ERROR (error_code, message[, {TRUE | FALSE}]);
对于用户定义的exception, 需要关联error_code
PRAGMA EXCEPTION_INIT (exception_name, error_code)
处理exception
EXCEPTION WHEN ex_name_1 THEN statements_1 -- Exception handler WHEN ex_name_2 OR ex_name_3 THEN statements_2 -- Exception handler WHEN OTHERS THEN statements_3 -- Exception handler END;
异常抛出

获取error_code, error_message,SQLCODE,SQLERRM
DROP TABLE errors; CREATE TABLE errors ( code NUMBER, message VARCHAR2(64) ); CREATE OR REPLACE PROCEDURE p AUTHID DEFINER AS name EMPLOYEES.LAST_NAME%TYPE; v_code NUMBER; v_errm VARCHAR2(64); BEGIN SELECT last_name INTO name FROM EMPLOYEES WHERE EMPLOYEE_ID = -1; EXCEPTION WHEN OTHERS THEN v_code := SQLCODE; v_errm := SUBSTR(SQLERRM, 1, 64); DBMS_OUTPUT.PUT_LINE ('Error code ' || v_code || ': ' || v_errm); /* Invoke another procedure, declared with PRAGMA AUTONOMOUS_TRANSACTION, to insert information about errors. */ INSERT INTO errors (code, message) VALUES (v_code, v_errm); RAISE; END; /
浙公网安备 33010602011771号