代码如下:
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),依次执行完,怎么才能做到啊?
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),依次执行完,怎么才能做到啊?
既然P_STATUS已经为1了,为什么还要判断P_STATUS 是否为2呢?
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这种情况啊。
如果要实现楼主你的需求,有三个问题你需要解决:第一,你的三个分支的判断条件是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;
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;
楼主在担心什么呢?
谁教你这两种是一样的。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;
结果一样?
( 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;
/
但是你偏要说一张一百块和两张二十块不一样...
抛出异常RAISE A1和赋值语句P_STATUS := 2怎么能比,抛出异常不会往下执行了,你懂吗?