设为首页 收藏本站
查看: 839|回复: 0

[经验分享] 怎样正确显示oracle异常行数(转)

[复制链接]

尚未签到

发表于 2016-7-25 11:11:13 | 显示全部楼层 |阅读模式
  在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版的代码标准

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-249144-1-1.html 上篇帖子: 几个 Oracle 常用函数 实例 运用 下篇帖子: Oracle分页rownum/rounum使用(转)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表