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

解决方案 »

  1.   

    1. 可以采用异常处理,在程序出现异常时,跳转到异常处理部分,在那里获取已经执行的行数。
    2. 使用系统预定义光标SQL%ROWCOUNT:获得的值为刚执行完的一条SQL语句处理的记录数目。
    3. 获得SQL语句执行时所用的时间,在SQL*Plus中很容易得到,通过set time on;设置,而后执行sql语句就会显示所耗费的时间;在PL/SQL中没有相应的方法,不过可以变通一下,在sql语句执行之前向一个临时表插入系统时间,在语句执行结束后,再向临时表插入一个系统的执行时间。最后输出一下这2个时间的差,即可获得执行时间。
      

  2.   


    请问“在那里获取已经执行的行数”,这个要怎么获取?能麻烦举个简单的例子么?这里获取的行数书存储过程SQL语句的行数吧?还是说被操作的数据的行数?
      

  3.   

    使用bulk connect into,结合forall,其中有个save exception的功能,可以保存错误的行数,具体用法查询oracle reference!