oracle - PL/SQL Oracle错误处理

标签 oracle error-handling plsql

我创建了一个触发器,该触发器仅允许用户拥有10个当前下订单。因此,现在当客户尝试下达11号订单时,oracle数据库会抛出一个错误。好3错误。

ORA-20000: You currently have 10 or more orders processing.

ORA-06512: at "C3283535.TRG_ORDER_LIMIT", line 12

ORA-04088: error during execution of trigger 'C3283535.TRG_ORDER_LIMIT'



最严重的错误是我使用以下方法创建的:

raise_application_error(-20000, 'You currently have 10 or more orders processing.');



我只是想知道搜索之后,并尝试了许多方法来更改其他两个错误的错误消息,甚至不将它们一起显示给用户?

这是我使用的代码
    create or replace trigger trg_order_limit
    before insert on placed_order for each row  
    declare
    v_count number;
    begin
   -- Get current order count
   select count(order_id)
   into   v_count
   from   placed_order
   where  fk1_customer_id = :new.fk1_customer_id;

   -- Raise exception if there are too many
   if v_count >= 10 then
   EXCEPTION
   WHEN OTHERS THEN
    raise_application_error(-20000, 'You currently have 10 or more orders  processing.');
   end if;
   end;

非常感谢
理查德

最佳答案

异常传播从内部到外部块,而不是从外部到内部块的变量范围。有关更多信息,请阅读McLaughlin的“使用PL/SQL编程”,第5章。

您在这里得到的是一个异常堆栈-从最里面的块到最外面的块引发的异常。

当您从触发器引发异常时,raise_application_error语句返回错误。

然后将其传播到触发块ORA-06512: at "C3283535.TRG_ORDER_LIMIT", line 12。这是因为触发器将引发的异常视为错误并停止继续。

然后将错误传播到引发ORA-04088: error during execution of trigger 'C3283535.TRG_ORDER_LIMIT'的 session 。该错误会向我们报告在程序的哪个部分出现错误的位置。

如果您使用的是Java Server Pages或PHP之类的前端程序,则会捕获到引发的错误-首先为20000。因此,您可以将其显示给最终用户。

编辑:

关于第一个错误-ORA-20000,您可以在RAISE_APPLICATION_ERROR语句本身中对其进行更改。

如果要处理ORA-06512,则可以使用Uday Shankar的答案,这有助于解决此错误并显示适当的错误消息。

但是,您仍然会得到最后的ORA-04088。如果我在您的位置,我不会担心,因为获取ORA-20000后,我会在前端本身引发应用程序错误,同时对用户隐藏所有其他详细信息。

实际上,这是Oracle异常堆栈的本质。从最内层到最外层块的所有错误都会引起。这对于我们识别错误的确切来源很有帮助。

关于oracle - PL/SQL Oracle错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15548176/

相关文章:

基于Oracle的SQL查询

java - 从 Java 调用 PL/SQL Web Toolkit 过程

python - 如何在主方法中引发自定义异常?

oracle - 列名在PL/SQL ORACLE中作为变量

sql - 计算 group by 中具有最大值的行

regex - Oracle 11g 通过正则表达式获取所有匹配的事件

perl - 来自Perl Net::FTP的错误原因

php - Apache ErrorDocument 指令不重定向

oracle - PL/SQL 开发人员 : debugging hangs on certain code

database - 获取 "Insert or Update"触发器内的操作类型