1、定义PLSQL异常
2、列举不同的异常处理方法
3、捕获非预期的错误
4、描述异常的影响
5、定制异常的返回信息[@more@]
最后一课 异常处理本章重点:
1、定义PLSQL异常
2、列举不同的异常处理方法
3、捕获非预期的错误
4、描述异常的影响
5、定制异常的返回信息
一、PLSQL异常处理
异常是由ORACLE错误或显式的抛出一个错误产生的。
如何处理:
用一个处理程序来捕获它;
将它传递给CALLING ENVIRONMENT
二、异常的类型:
ORACLE SERVER 预定义错误
非ORACLE SERVER 预定义错误,但也是ORACLE SERVER 的标准错误
用户自定义异常
三、捕捉异常的要点:
Place the WHEN OTHERS clause after all other exception handling clauses.
You can have at most one WHEN OTHERS clause.
Begin exception-handling section of the block with the keyword EXCEPTION.
Define several exception handlers, each with their own set of actions, for the
block.
When an exception occurs, PL/SQL will process only one handler before leaving
the block.
EXCEPTION
WHEN exception1 [OR exception2 . . .] THEN
statement1;
四、常用错误:
NO_DATA_FOUND ORA-01403
TOO_MANY_ROWS ORA-01422
INVALID_CURSOR ORA-01001
ZERO_DIVIDE ORA-01476
DUP_VAL_ON_INDEX ORA-00001
五、实例
PROCEDURE elim_inventory
(v_product_id IN s_product.id%TYPE) IS
v_id s_product.id%TYPE;
BEGIN
SELECT id
INTO v_id
FROM s_product
WHERE id = v_product_id;
DELETE FROM s_inventory
WHERE product_id = v_product_id;
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
ROLLBACK;
TEXT_IO.PUT_LINE(TO_CHAR(v_product_id)||
’ is invalid.’);
WHEN TOO_MANY_ROWS THEN
ROLLBACK;
TEXT_IO.PUT_LINE(’Data corruption in S_PRODUCT.’);
WHEN OTHERS THEN
ROLLBACK;
TEXT_IO.PUT_LINE(’Other error occurred.’);
END elim_inventory;
在SCOTT环境中使用要稍加改动
六、使用non-predefined Oracle7 Server error
DECLARE
E_PRO EXCEPTION;
PRAGMA EXCEPTION_INIT(E_PRO,ERROR_NUMBER);
BEGIN
......
EXCEPTION
WHEN E_PRO THEN
DBMS_OUTPUT.PUT_LINE('ASDLKFJKASDJFASJDFLKASDF');
......
END;
七、用户自定义
exception EXCEPTION;
RAISE exception; EXCEPTION
WHEN E_PRO THEN
DBMS_OUTPUT.PUT_LINE('ASDLKFJKASDJFASJDFLKASDF');
......
END; 这里,只有用户自定义异常是要显式声明的,其他两个不用。
在SUN OS5.8中,进行SVRMGRL> OERR ORA 01840 可返回信息
或查错误代码:
HTTP://TECHNET.ORACLE.COM/DOC/SERVER.815/A67785/E1500.HTM
题外话,create public database link otlink connect to system identified
by manager using 'oratest';
说回来,以下两个函数:
SQLCODE ----Returns the numeric value for the error code. You can assign it
to a NUMBER variable.
SQLERRM ----Returns character data containing the message associated with
the error number.
一般这样,
EXCEPTION
... WHEN OTHERS THEN
ROLLBACK;
v_error_code:=SQLCODE;
V_ERROR_MESSAGE:=SQLERRM;
INSERT INTO ........
END;
八、调用外围环境
SQLPLUS
PROCEDURE BUILDER
DEVELOPER 2000
OTHER .........
---- 也就是把ERROR NUMBER和MESSAGE输出到SCREEN。
九、使用RAISE_APPLICATION_ERROR
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20201,'NO MATCH RECORD YOU WANNA');