我们可以为pragma_exception_init做什么情况

时间:2016-12-05 14:21:29

标签: oracle11g

任何人都可以解释为什么我们需要pragma exception init。我们有用户定义的异常,它与pragma做同样的工作。您的回答将不胜感激。

1 个答案:

答案 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;