Oracle 无法将异常插入表中



我有以下过程,我正在尝试将异常跟踪到表中I_Log。为了测试它是否有效,我在查询中犯了一个ORA-00933: SQL command not properly ended错误,我试图插入到表中I_OPTION错误。当我运行此过程时,dbms 输出行正在打印下面的错误,但它没有插入到I_Log表中:

OTHERS exception in EXT_I_OPTION - ID:1000196-933----ORA-00933: SQL command not properly ended

以下是我的程序:

CREATE OR REPLACE PROCEDURE
  "EXT_I_OPTION"(in_id IN NUMBER DEFAULT 0)
AS
  err_code    VARCHAR(100);
  err_msg     VARCHAR(100);
  in_event_id NUMBER;
  in_db_link  VARCHAR2(50);
  in_env_id   NUMBER;
  l_sql       VARCHAR2(5000);
  l_sql1      VARCHAR2(5000);
  BEGIN        
    FOR I_row IN I_cur
    LOOP
      l_sql2 := INSERT INTO I_OPTION(ID)
                select DISTINCT(SO.ID)
                     )
                  from Icard I;                      
    END LOOP;
    EXCEPTION WHEN OTHERS THEN
      err_code := SQLCODE;
      err_msg := SUBSTR(SQLERRM, 1, 200);
      INSERT INTO I_log (I_ID)
      VALUES (i_id);   
      RAISE;
      COMMIT;
  END ext_I_option;
似乎

您在COMMIT之前有一个RAISE; 这样,错误将在执行COMMIT之前引发,因此您在日志表中找不到数据。

根据建议,您应该定义一个处理日志表的过程:

CREATE OR REPLACE procedure i_LOG (...) AS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    Insert into I_LOG(...); 
    COMMIT;
END;
/

此过程在单独的事务中运行,因此它只commit日志数据,与您在主过程中修改的数据不冲突。然后,您应该以这种方式修改错误处理,避免COMMIT语句,这可能非常危险,保存部分不一致的数据:

DBMS_OUTPUT.PUT_LINE('OTHERS exception in EXT_I_OPTION - ID:'||to_char(ID) || err_code || '----' || err_msg );
ins_I_LOG(...);
RAISE;

最新更新