在异常处理中显示SQLERRM就可以了,例如
  
  EXCEPTION    WHEN others THEN
      ROLLBACK;
      DBMS_OUTPUT.PUT_LINE('错误原因:'||SQLErrm);

解决方案 »

  1.   

    sqlerrm是错误的原因!
    而我要的是产生错误的源程序的sql语句!
      

  2.   

    知道了错误原因,你也可以单步执行该过程,设置断点,就可以找到产生错误的
    SQL语句
      

  3.   

    不是啊,我并不是在调试的时候知道是那条语句,而是想在程序运行的时候获得出错的sql语句,然后把它写到表里!
      

  4.   

    1. 如果过程中语句出错,那编译是无法通过的;
    2. 如果你用的是动态SQL, 那可以把动态语句写入表中,如
    ...
    BEGIN
      SQLSTR := 'UPDATE TBL ...';
      EXECUTE IMMEDIATE SQLSTR;
      EXCEPTION WHEN OTHERS
        INSERT INTO LOG_TABLE VALUES SQLSTR;
        ...
    END;
      

  5.   

    to 楼上:
    如果语句出错,编译的确不会通过,不过有些时候不是语法的问题,比如报6502或1405之类的运行期错误:如下,可能有好多语句包含在begin,end中.运行时如果出现异常我想在exception中得到该出错的语句,在pro*c中我试验过,不过在存储过程中不知道如何得到.
    begin
      ...
      ...
      ...
    exception
      得到出错语句
    end;
      

  6.   

    恐怕只能用PL/SQL块把语句分割开:
    begin
      ...
      BEGIN  ...
      ...
        exception
          得到出错语句;
      END;
      ...
      BEGIN  ...
      ...
        exception
          得到出错语句;
      END;
    end;
      

  7.   

    其实你可以把错误信息写到日志里,根据错误信息里有行号即可找到相应sql。
      

  8.   

    同意 KingSunSha(弱水三千)的意见,
    PL/SQL作为一种对象式的编程,能够通过如下方式扑获错误,但系统代码本身扑获错误的目的是能保证数据库操作的错误不会导致当前Package的CoreDown,而影响整个数据库或外部应用的运行, 所以在扑获到错误后,应该正确根据错误判断是保留现场 还是 先记录错误继续运行。这就要看你的应用逻辑了! 只是我的个人见解 谢谢!BEGIN
      <SQL statements>
      EXCEPTION WHEN OTHERS
        <Save your Exception or Raise here>    ...
    END;