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_message与NO_DATA_FOUND错误相关联?
更新:有人建议我RAISE_APPLICATION_ERROR在NO_DATA_FOUND遇到时使用引发自定义错误代码.这个问题的目的是确定是否可以避免这种技术,以便调用代码可以捕获NO_DATA_FOUND错误而不是自定义错误代码.捕获NO_DATA_FOUND似乎在语义上更正确,但我可能是错的.
使用 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.
| 归档时间: |
|
| 查看次数: |
5145 次 |
| 最近记录: |