Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 在异常类型上有一些混乱_Oracle_Plsql - Fatal编程技术网

Oracle 在异常类型上有一些混乱

Oracle 在异常类型上有一些混乱,oracle,plsql,Oracle,Plsql,我们可以使用用户定义的异常或使用OUT参数模式预定义的异常(其他,SQLERRM,SQLCODE)将错误消息、错误代码传递到前端,那么我们为什么使用RAISE\U应用程序错误过程呢 RAISE\u APPLICATION\u ERROR和pragmaEXCEPTION\u INIT之间有什么区别 我在谷歌上搜索了这些问题,但没有得到明确的答案——这就是为什么在这里发布的原因。用户定义的异常不会向调用应用程序提供任何消息。它只会得到一个通用的“ORA-06510:PL/SQL:unhandled

我们可以使用用户定义的异常或使用OUT参数模式预定义的异常(其他,SQLERRM,SQLCODE)将错误消息、错误代码传递到前端,那么我们为什么使用RAISE\U应用程序错误过程呢

  • RAISE\u APPLICATION\u ERROR
    和pragma
    EXCEPTION\u INIT
    之间有什么区别


  • 我在谷歌上搜索了这些问题,但没有得到明确的答案——这就是为什么在这里发布的原因。

    用户定义的异常不会向调用应用程序提供任何消息。它只会得到一个通用的“ORA-06510:PL/SQL:unhandled user-defined exception”
    raise\u application\u error
    用于传递描述实际问题的消息

    declare
        out_of_stock exception;
    begin
        raise out_of_stock;
    end;
    /
    
    ERROR at line 1:
    ORA-06510: PL/SQL: unhandled user-defined exception
    ORA-06512: at line 4
    
    
    begin
        raise_application_error(-20000, 'Cheese is out of stock');
    end;
    /
    
    ERROR at line 1:
    ORA-20000: Cheese is out of stock
    ORA-06512: at line 2
    
    pragma exception\u init(exception\u name,error\u code)
    允许您将自己的用户定义异常与系统错误代码关联。从编程的角度来看,这可能很有用,但最终不会为调用者增加任何价值:

    declare
        invalid_day_of_month exception;
        pragma exception_init(invalid_day_of_month, -1847);
    
        d date;
    begin
        d := to_date('99-JAN-2020','DD-MON-YYYY');
    exception
        -- Pointless exception handler - just to demo raising a user-defined exception
        when invalid_day_of_month then raise;
    end;
    /
    
    ERROR at line 2:
    ORA-01847: day of month must be between 1 and last day of month
    ORA-06512: at line 10
    ORA-06512: at line 7
    
    通过OUT参数传递成功/失败状态通常不是一个好主意,因为过程似乎已成功完成,调用方必须读取状态以查看它是否真的成功。

    。这两个问题的答案是,
    RAISE\u APPLICATION\u ERROR
    是定义要在客户端应用程序中显示的自定义错误消息的标准方法。是的,您也可以使用OUT参数、DBMS_输出或类似的东西传递自定义消息,但这些都不是标准化的,您必须在服务器端和客户端添加代码来处理它们

    DECLARE
       my_exception EXCEPTION;
       PRAGMA EXCEPTION_INIT(my_exception, -20001);
    BEGIN
       raise my_exception; -- message is default "ORA-20001: "
    END;
    /
    
    BEGIN
       raise_application_error(-20001, 'My custom error message'); -- message is "ORA-20001: My custom error message"
    END;
    /
    
    当您想要给出更有用的描述性错误消息时,这通常很有用

    DECLARE
      age NUMBER;
    BEGIN
      age := 'hello';
    EXCEPTION when VALUE_ERROR then
      raise_application_error(-20001, 'Age must be a number.');
    END;
    /
    
    因此,我们可以准确地告诉用户问题是什么:“年龄必须是一个数字”,而不是一般的“PL/SQL:数字或值错误:字符到数字的转换错误”