在oracle中的存储过程中,使用的EXCEPTION并用WHEN OTHERS
THEN进行捕获,但是捕获了后就没有办法知道出错具体出在哪一行,无法更正是哪一行报出的异常,是否有好的解决方法。
------解决方法
--------------------------------------------------------
1、用PL/SQL里面选择TEST->F9(开始测试)->打断点->选择执行到下一断点处。
2、使用DBMS_OUTPUT.PUT_LINE();每个SQL后面都加一个,结束后看看打印到那个就没了,对应的那个 SQL就是出问题的地方。
我通常写存储过程都用同一个EXCEPTION
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
P_ERR_LOG(SQLERRM,'PROCEDURE_NAME',SYSDATE);
ROLLBACK;
P_ERR_LOG是个存储过程,参数按顺序为:
错误信息、出错过程名称、时间
然后把信息存入一张日志表中。
------解决方法
--------------------------------------------------------
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_STACK);
DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_CALL_STACK);
这样就能把错误的详细信息打印出来了
------解决方法
--------------------------------------------------------
可以定义一个变量stmt_no,在每句前面为此变量赋值,如果出现exception,则stmt_no就是对应值的下一句,下面是Oracle给出的
例子:
CREATE OR REPLACE PROCEDURE loc_var AS
stmt_no NUMBER;
name VARCHAR2(100);
BEGIN
stmt_no := 1; -- designates 1st SELECT statement
SELECT table_name INTO name
FROM user_tables
WHERE table_name LIKE 'ABC%';
stmt_no := 2; -- designates 2nd SELECT statement
SELECT table_name INTO name
FROM user_tables
WHERE table_name LIKE 'XYZ%';
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE
('Table name not found in query ' || stmt_no);
END;
/
CALL loc_var();
------解决方法
--------------------------------------------------------
#4的做法是客户的1997版代码标准;
还有一种是尽量把逻辑写细到一个个小的procedure,然后用一个main
procedure在包内调用,每次调用后将计数器加1,然后将该数字保存到一个专门的表中,知道最后一步成功后再将计数器置1,这样也容易知道错误位
置,再次运行时可以从错误位置直接启动,restartbility非常好。这种写法是目前客户公司的2008版的代码标准
分享到:
相关推荐
详细介绍 ORACLE 异常错误处理异常错误处理异常错误处理
Oracle Sql语句转换成Mysql Sql语句java 源码,非常简单,只要给定源oracle sql语句地址,和生成目标文件地址运行即可。
这个是oracle课成异常处理章节后面的部分习题答案,大概四五道题的答案。
数据库 Mysql转oracle sql脚本转oracle脚本
Oracle Exception汇总(自定义Oracle异常) 使用方法举例: Exception When no_data_found then Dbms_output.put_line(‘no_data_found’); ACCESS_INTO_NULL 为对象赋值前必需初始化对象。对应ORA-06530错误。 CASE...
oracle异常及触发器.pptx
用存储过程写的动态行转列。简单易用,查询速度高效
oracle异常处理 把各种异常和解决方式总结出来了
ORACLE异常处理剖析.pdf
oracle笔记异常处理,异常处理的代码案例和知识点笔记!
请各网友本着共享精神,逐渐将此文档补全,供大家共同使用,此文档与本人上传的另一份oracle汉字转拼音的文档可以对比参看,先前一份函数全但存在好多问题,这份文档只有转全拼小写的部分,评论一句就可下载了。
Dbmover for Mysql to Oracle 是高效的将Mysql导入到Oracle数据库的工具。 使用DBMover可以灵活定义Mysql和Oracle之间表和字段的对照关系,也可以在DBMover创建一个查询,把查询结果当作源表转入到Oracle中。 ...
Oracle数据库中的异常:没有异常的转移,因为没有受检异常和非受检异常得区分。 1.异常的产生: 2.异常的处理: declare –变量定义,初始化赋值。 begin –变量的赋值,函数调用,if,while等。 ...
oracle预定义异常, ORACLE开发存储过程,函数,触发器等程序时,会经常使用到异常处理,该文档列举了常见的异常以及异常说明
ORACLE中CLOB字段转String类型
mysql数据库转oracle工具,解压即用,支持表结构转换a
Oracle将汉字转换为拼音,只有很少部分的生僻字无法识别以外的,基本可以转换
oracle scn修改工具,可以直接修改oracle scn,在极端情况下恢复使用,比如解决ORA-600 2662等类似错误,使用说明:https://www.xifenfei.com/2022/06/win-oracle-scn-patch.html
mysql oracle 阿拉伯数字转中文数字, 亲测可用.找了很长时间才找到,
如何正确删除Oracle归档日志,oralce归档日志清理.