我有下面的程序,我试图跟踪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;
答案 0 :(得分:2)
您RAISE
之前似乎有COMMIT
;这样,在执行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;