一、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');
END;
当然,RAISE_APPLICATION_ERRO也是可以放在EXECUTE区的,IF THEN
RAISE_APPLICATION_ERRO();
END IF;
这也是很好理解。
异常是由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');
END;
当然,RAISE_APPLICATION_ERRO也是可以放在EXECUTE区的,IF THEN
RAISE_APPLICATION_ERRO();
END IF;
这也是很好理解。
解决方案 »
- Oracle 数据备份文件拷坝到异地(Ftp)
- 存储过程传日期参数无法查询数据?
- sql求解大侠!
- oracle 树形结构,如果获得所有节点的根节点
- 关于PL/SQL的连接问题
- 数据库用户及表空间问题
- 百分求解,在线等待ORACLE7.3的DBF恢复问题
- 最近想自学Oracle请大家给点意见~~
- 请教:由于硬盘故障,数据全部毁灭,我换了一个硬盘,重装了Oracle8.17,请问如何将原先备份在磁带机上的数据恢复出来,最好能提供相关代
- 超复杂的问题
- 为什么不能运行Net8 Configuration Assiastant?
- 我的oracle中有两个数据库,请问imp数据的时候怎么指定是导入哪个库呢?
inappropriate in this context.Action: Check previous tokens as well as the one given in the error message. The line and column
numbers given in the error message refer to the end of the faulty language construct
多谢谢各位。
送分。
其实,只是因为我以前没有花时间去研究oracle,上上周是被逼要搞oracle的一些问题--因为项目组没有人能够做oracle的了,只好我自己来--。还好,经过一周的看书、查资料,写了许多过程与job,现在嘛,已经可以吹牛了,哈哈。
结果,上周五,oracle数据库给跨了,出现了ora-01200错误(没见过吧)。
嘿嘿,折腾一下午了,终于摆平了。
Q1:
dbms_sql.parse(cursor_name,strSQL,dbms_sql...)中的
strSQL超过255,
如何处理?
A:没办法,dbms_sql.parse(...)中的strSQL可以超过256,只要不超过32767就可以的。
至于为什么会出现问题,那是在调试的时候,会调用dbms_output.put_line,这时的参数不能大于256个字符。--当然有些调试工具会解决这一个问题的。如果自己想将strsql输出在screen上,那时就不能用dmbs_output了,只能自己写一个过程(在过程中调用,dbms_output)set serveroutput on size 1000000;
只能是对sql plus的设置