2017-08-20 70 views
-2

任何人都知道爲什麼我的異常不起作用?當我測試sql時,出現的唯一例外是其他人。SQL異常似乎不起作用

這是我的第一個存儲過程,我想讓它插入使用參數值的新學生。

create or replace PROCEDURE ADD_STUDENT_TO_DB (pSTUid number, pSTUname varchar2) AS 
    Out_Of_Range Exception; 
    BEGIN 
    IF pSTUid <=1 AND pSTUid >=499 THEN 
    RAISE Out_Of_Range; 
END IF; 
INSERT INTO STUDENT (STUid, STUname) 
VALUES (pSTUid, pSTUname); 

EXCEPTION 
WHEN DUP_VAL_ON_iNDEX THEN 
dbms_output.put_line('-20010. Duplicate student ID'); 

WHEN Out_Of_Range THEN 
dbms_output.put_line('-20002. student ID out of range'); 

WHEN OTHERS THEN 
dbms_output.put_line('-20000. Error'); 
END; 

這是我的第二個存儲過程,我希望這個調用我的第一個sp。

create or replace PROCEDURE ADD_STUDENT_VIASQLDEV (pSTUid number, pSTUname varchar2) AS 
BEGIN 

INSERT INTO STUDENT (STUid, STUname) 
VALUES (pSTUid, pSTUname); 

dbms_output.put_line('--------------------------------------------'); 
dbms_output.put_line('Adding student ID: ' || pSTUid || ' Name: ' || pSTUname); 

EXCEPTION 

WHEN OTHERS THEN 
dbms_output.put_line('-20000. Error'); 
END; 
+1

這是基本相同的問題,因爲你昨天張貼的問題。你的程序ADD_STUDENT_VIASQLDEV不會調用ADD_STUDENT_TO_DB,那麼爲什麼你會期望在第一個程序中聲明的異常可以通過運行第二個程序來提出? – APC

+1

_「這是我的第二個存儲過程,我希望這可以調用我的第一個sp。」_因此,請調用它。這與你關於異常的問題有什麼關係?此外,你會發現一些小小的代碼格式化,可以更容易地直觀地看到程序正在做什麼。 –

+0

這是另一個邏輯問題。看看你的情況。你已經使用了一個布爾AND。但是'id'不能少於一個*和*同時大於499。嘗試一個OR來代替。 – APC

回答

0

應該存在IF pSTUid <=1 OR pSTUid >=499 THEN,而不是你的語句out_of_range