Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 从PL/SQL返回错误_Oracle_Plsql - Fatal编程技术网

Oracle 从PL/SQL返回错误

Oracle 从PL/SQL返回错误,oracle,plsql,Oracle,Plsql,简单明了的问题: 我正在编写一个PL/SQL存储过程。它包含一些可能失败的executeimmediate调用。我不想提出错误。我希望存储过程干净地完成其执行并返回错误列表。比如: for vRecord in vCursor loop begin execute immediate 'insert into t(a) values (' || vRecord.val || ')'; when others then -- store the er

简单明了的问题:

我正在编写一个PL/SQL存储过程。它包含一些可能失败的
executeimmediate
调用。我不想提出错误。我希望存储过程干净地完成其执行并返回错误列表。比如:

for vRecord in vCursor
loop
    begin
        execute immediate 'insert into t(a) values (' || vRecord.val || ')';
    when others then
        -- store the error somewhere to return it!!
    end;
end loop;
所以我的问题是:返回这些错误的推荐方法是什么?一张桌子?输出参数


非常感谢。

哇,我刚刚在另一个帖子中回答了类似的问题,到目前为止都是奇怪的一天。如果只想记录错误(或消息),请使用日志表并使用自治事务:


请参见

从版本10g Release 2开始,您可以使用DML错误日志将所有错误存储在一个特殊的表中。您可以在此处阅读:

基于您发布的代码的其他一些建议:

1) 这里不需要使用动态SQL。用这个代替:

insert into t(a) values (vRecord.val);
2) 这里不需要使用循环。只需使用插入/选择:

insert into t(a) select [the query from your vCursor here]
问候,

罗伯。

谢谢!我想到了。但我不知道这是不是最好的选择。使用表只是返回错误,这似乎是一种过激的行为。。。无论如何,谢谢你的建议!永远不要过度记录错误,良好做法;)假设这是在某个频率上运行的,那么您可以对随着时间发生的情况进行审计跟踪。您真的应该使用类似dbms_实用程序。format_error_stack | dbms_实用程序。format_error_backtrace,而不仅仅是SQLERRM。非常感谢您的回答。我将看一看DML错误日志。谢谢你的建议。但是,我发布的只是一个示例代码。我的实际代码确实需要动态SQL。最好使用Oracle的内置功能,而不是使用我们自己的功能。然而,我不确定将DML错误记录与动态SQL结合使用会有多容易;这取决于SQL是以何种方式动态的……这是真的。表-t在本例中不应是动态的:-)