2017-08-20 72 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