异常总结
xxx EXCEPTION;
变量,然后直接raise xxx;
,sqlcode永远为1。-20000到-20999
。sqlcode总结
-20000到-20999
。create table t12(info varchar(2));
BEGIN
INSERT INTO t12 VALUES('11111111111');
EXCEPTION
WHEN others THEN
dbms_output.put_line(sqlcode);
dbms_output.put_line(sqlerrm);
END;
/
-- -12899
-- ORA-12899: value too large for column "SYS"."T12"."INFO" (actual: 11, maximum: 2)
从文档中看
sqlcode可以使用范围:-00001
到-99999
,五位负数。
实例:
...
ORA-12872: First slave parse gave different plan
ORA-12899: value too large for column string (actual: string, maximum: string)
ORA-12899: value too large for column string (actual: string, maximum: string)
ORA-12901: default temporary tablespace must be of TEMPORARY type
...
触发方式:
create table t12(info varchar(2));
DECLARE
vvv EXCEPTION;
PRAGMA EXCEPTION_INIT(vvv, -12899);
BEGIN
INSERT INTO t12 VALUES('11111111111');
EXCEPTION
WHEN vvv THEN
dbms_output.put_line(sqlcode);
dbms_output.put_line(sqlerrm);
END;
/
Exception Name | Error Code | 内部异常 |
---|---|---|
ACCESS_INTO_NULL | -6530 | ORA-06530: Reference to uninitialized composite |
CASE_NOT_FOUND | -6592 | ORA-06592: CASE not found while executing CASE statement |
COLLECTION_IS_NULL | -6531 | ORA-06531: Reference to uninitialized collection |
CURSOR_ALREADY_OPEN | -6511 | ORA-06511: PL/SQL: cursor already open |
DUP_VAL_ON_INDEX | -1 | ORA-00001: unique constraint (*string*.*string*) violated |
INVALID_CURSOR | -1001 | |
INVALID_NUMBER | -1722 | ORA-01722: invalid number |
LOGIN_DENIED | -1017 | |
NO_DATA_FOUND | +100 | 特殊 |
NO_DATA_NEEDED | -6548 | ORA-06548: no more rows needed |
NOT_LOGGED_ON | -1012 | |
PROGRAM_ERROR | -6501 | |
ROWTYPE_MISMATCH | -6504 | |
SELF_IS_NULL | -30625 | |
STORAGE_ERROR | -6500 | ORA-06500: PL/SQL: storage error |
SUBSCRIPT_BEYOND_COUNT | -6533 | |
SUBSCRIPT_OUTSIDE_LIMIT | -6532 | |
SYS_INVALID_ROWID | -1410 | |
TIMEOUT_ON_RESOURCE | -51 | |
TOO_MANY_ROWS | -1422 | ORA-01422: exact fetch returns more than requested number of rows |
VALUE_ERROR | -6502 | ORA-06502: PL/SQL: numeric or value error*string* |
ZERO_DIVIDE | -1476 |
内部异常
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 others THEN
dbms_output.put_line(sqlcode);
dbms_output.put_line(sqlerrm);
END;
/
-- -1476
-- ORA-01476: divisor is equal to zero
预定义异常
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(sqlcode);
dbms_output.put_line(sqlerrm);
END;
/
-- -1476
-- ORA-01476: divisor is equal to zero
DECLARE
xxx EXCEPTION;
BEGIN
raise xxx;
EXCEPTION
WHEN xxx THEN
dbms_output.put_line(sqlcode);
dbms_output.put_line(sqlerrm);
END;
/
-- 1
-- User-Defined Exception
sqlcode范围:-20000到-20999
BEGIN
RAISE_APPLICATION_ERROR(-20222, 'raise my zero devide!');
EXCEPTION
WHEN others THEN
dbms_output.put_line(sqlcode);
dbms_output.put_line(sqlerrm);
END;
/
-- -20222
-- ORA-20222: raise my zero devide!
sqlcode范围:-20000到-20999
DECLARE
zzz EXCEPTION;
PRAGMA EXCEPTION_INIT (zzz, -20222);
BEGIN
RAISE_APPLICATION_ERROR(-20222, 'raise my zero devide!');
EXCEPTION
WHEN zzz THEN
dbms_output.put_line(sqlcode);
dbms_output.put_line(sqlerrm);
END;
/
-- -20222
-- ORA-20222: raise my zero devide!