我的文件包含INSERTs
,UPDATEs
,DELETEs
。我想执行此文件中的每个DML语句,但是如果发生任何异常,我想打印该异常并继续。有一个简单的解决方案吗?下面是一个解决方案,它涉及将每个 DML包装在一个匿名块中并打印异常,但我认为它不够简单(或优雅):
BEGIN
<<DML statement goes here>>
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
END;
毋庸置疑,数百种DML无法轻松完成。
答案 0 :(得分:3)
可能的决定是在语句中添加错误记录子句。对于您的每个语句,您必须添加以下内容(例如INSERT
):
insert into my_table (...)
values (...)
LOG ERRORS INTO err$_my_table ('INSERT') REJECT LIMIT UNLIMITED;
此处err$_my_table
是用于错误记录的表。要创建它,请执行以下操作(每个表一次):
begin
DBMS_ERRLOG.CREATE_ERROR_LOG ('MY_TABLE');
end;
/
错误日志记录子句禁止任何异常,并将错误记录表中的所有行放入,这会引发异常。执行后,您可以查询这些表。它们还包含SQLCODE
和SQLERRM
函数的值。此方法的缺点 - 您需要更改所有语句并为每个表创建日志记录表
更多关于documentation中的条款。