繁体   English   中英

Oracle无法将异常插入表中

[英]Oracle not able to insert exception into table

下面我有哪里我试图跟踪异常转换成程序I_Log table.To测试其是否工作与否我已经做了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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM