在PL/SQL中引发错误时提供更有意义的消息

Ada*_*ter 2 oracle error-handling plsql

假设我有一个PL/SQL函数从表中选择一个值.如果查询没有返回任何记录,我希望NO_DATA_FOUND传播错误(以便调用代码可以捕获它),但是在调用时会出现更有意义的错误消息SQLERRM.

这是我想要完成的一个例子:

FUNCTION fetch_customer_id(customer_name VARCHAR2) RETURN NUMBER;
    customer_id NUMBER;
BEGIN
    SELECT customer_id
      INTO customer_id
      FROM CUSTOMERS
     WHERE customer_name = fetch_customer_id.customer_name;

    RETURN customer_id;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        meaningful_error_message := 'Customer named ' || customer_name || ' does not exist';
        RAISE;
END;
Run Code Online (Sandbox Code Playgroud)

有没有办法meaningful_error_messageNO_DATA_FOUND错误相关联?

更新:有人建议我RAISE_APPLICATION_ERRORNO_DATA_FOUND遇到时使用引发自定义错误代码.这个问题的目的是确定是否可以避免这种技术,以便调用代码可以捕获NO_DATA_FOUND错误而不是自定义错误代码.捕获NO_DATA_FOUND似乎在语义上更正确,但我可能是错的.

Tho*_*Low 7

使用 RAISE_APPLICATION_ERROR (-20001, 'your message');

这将返回错误号-20001,并返回您的消息而不是NO_DATA_FOUND消息.Oracle已在-20001和-210000之间保留了错误编号,供用户在其应用程序中使用,因此您不会使用这些编号隐藏另一个Oracle错误.

编辑: RAISE_APPLICATION_ERROR专门设计用于允许您创建自己的错误消息.因此Oracle没有另一种允许动态错误消息的方法.要进一步细化,可以在定义过程的包中定义自己的异常.添加以下内容:

CUSTOMER_NO_DATA_FOUND  EXCEPTION; 
EXCEPTION_INIT (CUSTOMER_NO_DATA_FOUND, -20001);
Run Code Online (Sandbox Code Playgroud)

在您的过程代码中,您执行了RAISE_APPLICATION_ERROR,并且客户端代码可以执行 WHEN CUSTOMER_NO_DATA_FOUND THEN看起来更好的内容,并且它们仍然会捕获错误消息SQLERRM.