我创建了一个触发器,该触发器仅允许用户拥有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/