我正在使用SQLERRM。但是还有更多的程序并行运行,因此有时SQLERRM被其他程序覆盖。使用并行运行是指我同时运行过程a和过程b.SQLERRM是全局函数,这是我的问题。如果两个过程都抛出异常,则可能会发生,过程a修改过程b中的错误消息,过程b得到错误消息。
这些过程使用简单的构造:

BEGIN
--do something/cutted off
EXCEPTION
        WHEN OTHERS THEN
            write_log(SYSDATE, 'ERROR_1', SQLERRM);

END;

这些过程调用write_log,声明为
 CREATE OR REPLACE PROCEDURE WRITE_LOG
 (
        TS_START IN DATE DEFAULT SYSDATE,
        ERR_CODE IN VARCHAR DEFAULT NULL,
        ERR_DESC IN VARCHAR DEFAULT NULL
 )
 IS

 BEGIN
  INSERT INTO LOG
        ( LOG_TS_START, LOG_ERR_CODE, LOG_ERR_DESC)
    VALUES
        (TS_START, ERR_CODE, ERR_DESC);


   COMMIT;

END WRITE_LOG;

如何避免覆盖SQLERRM?正在写入日志,但错误消息是错误的。

最佳答案

首先,摆脱PL/SQL代码中的常见错误。

没有WHEN OTHERS THEN且没有任何理性逻辑的RAISE只是有用的东西,无非是一个bug。

删除所有exception blocks,然后重试。并且,遵循良好的编码习惯。

10-04 10:53