【问题标题】:Returning errors from PL/SQL从 PL/SQL 返回错误
【发布时间】:2011-02-07 13:48:16
【问题描述】:

快速直接的问题:

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

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;

所以我的问题是:返回这些错误的推荐方法是什么?一张桌子?输出参数?

非常感谢。

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

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

    here

    【讨论】:

    • 谢谢!我想到了那个。虽然不知道这是否是最好的选择。使用 TABLE 只是为了返回错误似乎是一种过度杀戮......无论如何感谢您的建议!
    • 永远不要过度记录错误,这是一种很好的做法;)并且您可以对随着时间的推移发生的事情进行审计跟踪,假设这是您将以某种频率运行的事情。
    • 你真的应该使用类似 dbms_utility.format_error_stack||dbms_utility.format_error_backtrace 而不仅仅是 SQLERRM。
    【解决方案2】:

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

    http://download.oracle.com/docs/cd/E11882_01/appdev.112/e16760/d_errlog.htm#ARPLS680

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

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

    insert into t(a) values (vRecord.val);
    

    2) 这里没有必要使用循环。只需使用 INSERT/SELECT 代替:

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

    问候,
    抢。

    【讨论】:

    • 非常感谢 Rob 的回答。我将看一下 DML 错误日志记录。也感谢您的建议。但是,我发布的只是一个示例代码。我的实际代码确实需要动态 SQL。
    • 使用 Oracle 的内置功能而不是滚动我们自己的功能始终是最好的主意。但是,我不确定将 DML 错误记录与动态 SQL 一起使用会有多容易。这取决于 SQL 的动态方式...
    • 是的。表 - 在这种情况下为 t - 不应该是动态的 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2014-06-20
    相关资源
    最近更新 更多