【问题标题】:two exceptions in the same module同一模块中的两个异常
【发布时间】:2020-12-11 10:23:04
【问题描述】:

我想为我的姓名和年龄值使用两个例外,但它是 不可能的。 100 是 NO_DATA_FOUND 的代码。

create or replace ....) 
IS
  

    age_excep EXCEPTION; 
    PRAGMA EXCEPTION_INIT(age_excep , 100);
    name_excep EXCEPTION; 
    PRAGMA EXCEPTION_INIT(name_excep, 100);
BEGIN
.
.
.
.
EXCEPTION
    WHEN name_excep THEN
  
       DBMS_OUTPUT.PUT_LINE('Empty name : ');

    WHEN age_excep THEN --- HERE IS THE ERROR.IT SAYS THAT "YOU MUST PUT name_excep AND age_excep IN SAME EXEPTION (PLS-00484)
  
       DBMS_OUTPUT.PUT_LINE('Empty age: ');
    

END;

【问题讨论】:

    标签: sql oracle exception plsql


    【解决方案1】:

    100 是 NO_DATA_FOUND 的代码。

    嗯,这并没有错,但前提是您在 ANSI 模式下运行。默认情况下,您的数据库将处于 Oracle 模式,并且在该模式下 NO_DATA_FOUND 会抛出 ORA-01403。

    无论如何,问题在于您定义了两个具有相同错误代码的异常。 Oracle 不明白错误代码是否与缺少姓名或缺少年龄有关,因为这是业务逻辑。因此,对于同一个错误块中的同一个错误代码,您不能有两个异常处理程序。

    因此,您需要更改程序。

    第一个选项(也是最好的)是从分配的用户定义异常范围内给出异常编号,-20999 到 -20000

        age_excep EXCEPTION; 
        PRAGMA EXCEPTION_INIT(age_excep , -20000);
        name_excep EXCEPTION; 
        PRAGMA EXCEPTION_INIT(name_excep, -20001);
    

    这将允许您在代码中显式抛出命名异常并在异常块中处理它。

    EXCEPTION
        WHEN name_excep THEN
           DBMS_OUTPUT.PUT_LINE('Empty name : ');
    
        WHEN age_excep THEN 
           DBMS_OUTPUT.PUT_LINE('Empty age: ');
        
    
    END;
    

    这是否适合您取决于您​​发布的省略部分中代码的性质:您如何检查 NAME 和 AGE?两种不同的套路? SQL 还是 PL/SQL?如果您需要进一步的帮助,您需要发布更多代码。

    第二种选择是有一个例外来处理这两个:

        age_name_excep EXCEPTION; 
        PRAGMA EXCEPTION_INIT(age_name_excep , -100);
    

    您需要一个更通用的错误处理程序:

    EXCEPTION
        WHEN age_name_excep THEN
      
           if name is null then 
               DBMS_OUTPUT.PUT_LINE('Empty name : ');
           else
               DBMS_OUTPUT.PUT_LINE('Empty age: ');
           end if;
    END;
    

    我承认你有点笨拙,这就是为什么第一个选项更好。


    顺便说一句,通过显示消息“处理”异常对于练习来说是可以的,但在现实生活中被认为是不好的做法。在大多数工作环境中,DDBMS_OUTPUT 消息可以被用户抑制或不可见。更好的方法是将错误记录在数据库表(或文件)中,然后将异常重新引发调用程序。在大多数情况下,调用程序(或最终用户)有权决定如何处理异常。

    【讨论】:

    • 感谢您的回答@APC。我有两个 Select's .... SELECT name1 INTO name FROM Group WHERE name1="Example";..... 和... SELECT age1 INTO age FROM组 WHERE age1="50";因此,在每个 Select 之后,我想知道 name 或 age 是否为 NULL。如果它们是 ->exception
    猜你喜欢
    • 2011-07-30
    • 1970-01-01
    • 2014-04-21
    • 2014-01-03
    • 1970-01-01
    • 2012-06-28
    • 2015-07-26
    • 1970-01-01
    • 2011-12-19
    相关资源
    最近更新 更多