日期:2014-05-16  浏览次数:21142 次

请教oracle存储过程,如何记录错误发生所在行?如何记录某语句更新了多少行?
我有个oracle存储过程,是要放在UNIX服务器上用crontab脚本定时跑,因为数据量大,UPDATE操作和INSERT操作都比较多,执行时间很长,很容易出现一线异常错误导致存储过程只执行了部分,后面的语句因为错误而没有执行。用sqlcode和sqlerrm又都只记录了错误原因,没法定位是哪个SQL的问题,请问有没办法在错误发生的时候,知道错误是发生在哪一行?
  另外,在存储过程中,某个insert或者update操作执行完毕以后,有没有办法记录下这个语句插入或者更新了多少行?这个语句执行花费了多长时间?

------解决方案--------------------
1. 可以采用异常处理,在程序出现异常时,跳转到异常处理部分,在那里获取已经执行的行数。
2. 使用系统预定义光标SQL%ROWCOUNT:获得的值为刚执行完的一条SQL语句处理的记录数目。
3. 获得SQL语句执行时所用的时间,在SQL*Plus中很容易得到,通过set time on;设置,而后执行sql语句就会显示所耗费的时间;在PL/SQL中没有相应的方法,不过可以变通一下,在sql语句执行之前向一个临时表插入系统时间,在语句执行结束后,再向临时表插入一个系统的执行时间。最后输出一下这2个时间的差,即可获得执行时间。
------解决方案--------------------
报错的函数,这个好像没有,你要多定义一些异常,然后通过异常类型进行错误定位吧。。。
------解决方案--------------------
使用bulk connect into,结合forall,其中有个save exception的功能,可以保存错误的行数,具体用法查询oracle reference!