任何人都可以解释为什么我们需要pragma exception init。我们有用户定义的异常,它与pragma做同样的工作。您的回答将不胜感激。
答案 0 :(得分:0)
pragma exception_init用于为异常提供名称,以便您可以在异常处理程序中通过该名称引用异常。数千个Oracle异常中只有少数具有预定义的名称。您可以使用exception_init为这些其他异常创建名称。
请参阅https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/errors.htm#BABGIIBI
我正在编辑之前的答案,因为我可以在此处插入格式化文本。 在您的示例中,您正在定义要抛出的异常,但是如果要捕获系统正在抛出但却未命名的现有异常,该怎么办?在下面的示例中,我处理了两个特定错误' DATA_NOT_FOUND'和ORA-600,这是系统错误(是的,我有一些代码可以获取这些错误)。
CREATE OR REPLACE PROCEDURE exception_init_demo
AS
l_routine VARCHAR2 (30) := $$plsql_unit;
severe_system_error EXCEPTION;
PRAGMA EXCEPTION_INIT (severe_system_error, -600);
BEGIN
-- Execution code goes here
NULL;
EXCEPTION
WHEN severe_system_error
THEN
-- Severe error, log it, notify the dba, re-raise the exception
log_error (
p_application => $$plsql_unit
, p_routine => l_routine
, p_message => SQLERRM || UTL_TCP.crlf || DBMS_UTILITY.format_error_backtrace ()
);
notify_dba;
RAISE;
WHEN NO_DATA_FOUND
THEN
-- No data was found, this is OK, ignore error and return
return;
WHEN OTHERS
THEN
-- all other errors we will log and re-raise
log_error (
p_application => $$plsql_unit
, p_routine => l_routine
, p_message => SQLERRM || UTL_TCP.crlf || DBMS_UTILITY.format_error_backtrace ()
);
RAISE;
END;