我正在使用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
,然后重试。并且,遵循良好的编码习惯。