【问题标题】:Oracle not able to insert exception into tableOracle 无法将异常插入表中
【发布时间】:2016-05-17 21:18:57
【问题描述】:

我有以下程序,我试图将异常跟踪到I_Log 表中。为了测试它是否工作,我在我试图插入I_OPTION 表的查询中犯了ORA-00933: SQL command not properly ended 错误.当我运行这个程序时,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;

【问题讨论】:

    标签: sql oracle exception stored-procedures


    【解决方案1】:

    你好像在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;
    

    【讨论】:

    • 没错。插入日志表应使用AUTONOMOUS_TRANSACTION pragma 在单独的过程中完成。
    • 感谢 Aleksej 现在的工作。 @ammoQ 您是否有任何小示例可以使用 Autonomous_Trasaction 在单独的过程中跟踪日志表,并且在每个过程中都有什么缺点吗?
    • 根据 ammoQ 的建议编辑了答案
    • 您对此没有任何限制;我不会在每个包中回复该程序,最好将其保存在实用程序包中,甚至作为独立程序。我通常使用独立程序,但不知何故这是个人选择
    猜你喜欢
    • 1970-01-01
    • 2017-01-03
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2017-02-18
    • 2012-03-15
    • 2012-03-01
    相关资源
    最近更新 更多