gpt4 book ai didi

oracle - 当 PL/SQL 中出现错误时提供更有意义的消息

转载 作者:行者123 更新时间:2023-12-02 02:23:28 25 4
gpt4 key购买 nike

假设我有一个 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;

有没有办法将meaningful_error_messageNO_DATA_FOUND错误关联起来?

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

最佳答案

使用RAISE_APPLICATION_ERROR(-20001,'您的消息');

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

编辑: RAISE_APPLICATION_ERROR 专门设计用于允许您创建自己的错误消息。所以Oracle没有其他方法允许动态错误消息。为了进一步完善这一点,您可以在定义过程的包中定义自己的异常。添加以下内容:

CUSTOMER_NO_DATA_FOUND  EXCEPTION; 
EXCEPTION_INIT (CUSTOMER_NO_DATA_FOUND, -20001);

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

关于oracle - 当 PL/SQL 中出现错误时提供更有意义的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1239164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com