在存储过程中执行insert/select等操作的时候,如果执行到某一条记录的时候出错了,那怎么才能定位到出错的行号?比如说我在做关联
   insert into tmp(id,name,cino)
      select a.id,b.name,c.cino from tmp_id a
         left join tmp_name b
          on a.accno=b.accno
         left join tmp_cino c
          on a.accno=c.accno
        where a.bal<>0
在执行到某一条错误那怎么样才能定位出错误的行号,,非常感谢!!!

解决方案 »

  1.   

    我记得好像使用pl/sql时你测试存储过程如果出错的话,就会弹出提示是否查看错误,然后直接把错误就指到该行了,
    楼主可以试试
      

  2.   

    楼主加上一个exception,出现异常就记录一下error
      

  3.   

    SQL> CREATE TABLE T(X INT);
     
    Table created
     
    SQL> exec dbms_errlog.create_error_log('T','T1',USER);
     
    PL/SQL procedure successfully completed
     
    SQL> INSERT INTO T VALUES('X') LOG ERRORS INTO T1;
     
    INSERT INTO T VALUES('X') LOG ERRORS INTO T1
     
    ORA-01722: 无效数字
     
    SQL> SELECT * FROM T1;
    ORA_ERR_NUMBER$ ORA_ERR_MESG$                  O ORA_E ORA_E X
    --------------- ------------------------------ - ----- ----- ------
               1722 ORA-01722: 无效数字              I           X通过T1表记录T表的插入错误,不知道是不是楼主所需要的
      

  4.   

    执行过程后,有出错的话
    在命令行(pl/sql),使用命令
    show err 回车
      

  5.   

    有点无聊的问题. 
    遇到错误后,oracle已经回滚了.
    其实你希望的就是知道那条查询结果导致错误而已.
    在比较简单的情况下,直接执行查询字句,然后再根据insert语句的提示来判断哪行的数据有问题.
    没什么困难的.
      

  6.   

    用plsql是没有问题的,可是写在存储过程里面用shell调用就看不到了,,只能写到日志表里面,那就得知道是哪条记录的!