代码如下:
CREATE OR REPLACE PROCEDURE RAISE_EXCEPTIONPRO
( P_NUMBER IN NUMBER)
IS
RESULT NUMBER :=0;

FUNCTION RAISE_EXCEPTION (P_STATUS IN NUMBER) 
RETURN INTEGER
IS
A1 EXCEPTION;
A2 EXCEPTION;
A3 EXCEPTION;
BEGIN
IF(P_STATUS = 1) THEN
RAISE A1;
ELSIF(P_STATUS = 2) THEN
RAISE A2;
ELSIF(P_STATUS = 3) THEN
RAISE A3;
END IF;
RETURN 0;
EXCEPTION
WHEN A1 THEN
RETURN 1;
WHEN A2 THEN
RETURN 2;
WHEN A3 THEN
RETURN 3;
WHEN OTHERS THEN
ROLLBACK;
END RAISE_EXCEPTION;
BEGIN
RESULT :=RAISE_EXCEPTION(P_NUMBER);
DBMS_OUTPUT.PUT_LINE(RESULT);
END;
/
在第一个IF(P_STATUS = 1)完成后还要返回到ELSIF(P_STATUS = 2),依次执行完,怎么才能做到啊?

解决方案 »

  1.   

    咦?好奇怪。。
    既然P_STATUS已经为1了,为什么还要判断P_STATUS 是否为2呢?
      

  2.   

    不用else 就好了 。。 else 是互斥的啊 
      

  3.   

    P_STATUS 是由P_NUMBER传过来的,就是已经存在的数据,数值有1,2,3,…
      

  4.   

    回复3楼,那如果不用else,怎么判断P_STATUS为2,3,值呢?
      

  5.   

    分支结构没有搞清楚啊。
    IF 条件1 THEN 操作1
    ELSE IF 条件2 THEN 操作2
    ELSE IF 条件3 THEN 操作3
    ......................
    ELSE IF 条件n THEN 操作n
    ELSE 操作n+1是说如果条件1成立,就执行操作1,然后接着操作n+1后面的语句执行。
    如果条件1不成立,判断条件2,如果条件2成立,就执行操作2,然后接着操作n+1后面的语句执行。
    如果条件2不成立,判断条件3,如果条件3成立,就执行操作3,然后接着操作n+1后面的语句执行。
    如果条件2不成立,以后类推如果所有的条件都不成立,执行操作n+1,
    所以无论如何不能操作1执行了,再去判断条件2这种情况啊。
      

  6.   


    如果要实现楼主你的需求,有三个问题你需要解决:第一,你的三个分支的判断条件是P_STATUS分别等于1、2、3,那么就不可以实现同时执行多个分支的情况,因为P_STATUS不可能即等于1又等于2或3,不可能存在这样的数。第二,你的三个分支内部执行的代码是raise,当raise出现时会自动退出当前执行的程序段,进入异常处理部分。第三,到了这步才需要解决如何处理串行执行3个IF判断。综上所述,你所需要的代码大致如下:
    BEGIN
      IF(P_STATUS = 1) THEN
      ......
      END IF;
    EXCEPTION
      ...
    END;BEGIN
      IF(P_STATUS = 2) THEN
      ......
      END IF;
    EXCEPTION
      ...
    END;BEGIN
      IF(P_STATUS = 3) THEN
      .......
      END IF;
    EXCEPTION
      ...
    END;
      

  7.   

    IF(P_STATUS = 1) THEN
    RAISE A1;
    ELSIF(P_STATUS = 2) THEN
    RAISE A2;
    ELSIF(P_STATUS = 3) THEN
    RAISE A3;
    END IF;
    这种写法和下面的意思是一样的
    IF(P_STATUS = 1) THEN
    RAISE A1;
    end if;
    IF(P_STATUS = 2) THEN
    RAISE A2;
    end if;
    IF(P_STATUS = 3) THEN
    RAISE A3;
    END IF;
    楼主在担心什么呢?
      

  8.   


    谁教你这两种是一样的。IF(P_STATUS = 1) THEN
     P_STATUS := 2;
    ELSIF(P_STATUS = 2) THEN
     P_STATUS := 3;
    ELSIF(P_STATUS = 3) THEN
     P_STATUS := 4;
    END IF;
    IF(P_STATUS = 1) THEN
     P_STATUS := 2;
    end if;
    IF(P_STATUS = 2) THEN
     P_STATUS := 3;
    end if;
    IF(P_STATUS = 3) THEN
     P_STATUS := 4;
    END IF;
    结果一样?
      

  9.   

    9楼正解,我后来也想到了用小函数来做,和9楼的思想基本一致。谢谢各位不吝赐教!我的代码如下:CREATE OR REPLACE PROCEDURE EXTMENU.RAISE_EXCEPTIONPRO
    ( P_NUMBER IN NUMBER)
    IS
    RESULT1 NUMBER :=0;
    RESULT2 NUMBER :=0;
    RESULT3 NUMBER :=0;

    FUNCTION A1FUNC (P_STATUS IN NUMBER) 
    RETURN INTEGER
    IS
    A1 EXCEPTION;
    BEGIN
    IF(P_STATUS = 1) THEN
    RAISE A1;
    END IF;
    RETURN 0;
    EXCEPTION
    WHEN A1 THEN
    RETURN 1;
    END A1FUNC;

    FUNCTION A2FUNC (P_STATUS IN NUMBER) 
    RETURN INTEGER
    IS
    A2 EXCEPTION;
    BEGIN
    IF(P_STATUS = 2) THEN
    RAISE A2;
    END IF;
    RETURN 0;
    EXCEPTION
    WHEN A2 THEN
    RETURN 2;
    END A2FUNC;

    FUNCTION A3FUNC (P_STATUS IN NUMBER) 
    RETURN INTEGER
    IS
    A3 EXCEPTION;
    BEGIN
    IF(P_STATUS = 3) THEN
    RAISE A3;
    END IF;
    RETURN 0;
    EXCEPTION
    WHEN A3 THEN
    RETURN 3;
    END A3FUNC;

    BEGIN
    RESULT1 :=A1FUNC(1);
    RESULT2 :=A2FUNC(2);
    RESULT3 :=A3FUNC(3);

    DBMS_OUTPUT.PUT_LINE(RESULT1);
    DBMS_OUTPUT.PUT_LINE(RESULT2);
    DBMS_OUTPUT.PUT_LINE(RESULT3);
    END;
    /
      

  10.   

    一张一百块和两张五十块是一样的,如果这样说你会同意吗?
    但是你偏要说一张一百块和两张二十块不一样...
    抛出异常RAISE A1和赋值语句P_STATUS := 2怎么能比,抛出异常不会往下执行了,你懂吗?