2015-10-25 4 views
0

Я пытаюсь создать исключение, когда процедура не вставляет запись. Мой код выглядит следующим образом:PLSQL EXCEPTION не работает

CREATE OR REPLACE PROCEDURE OPEN_CLASS(
    p_class IN TUTPRAC.CLASSID%TYPE, 
    p_unitc IN TUTPRAC.UNITCODE%TYPE, 
    p_classd IN TUTPRAC.CLASS_DAY%TYPE, 
    p_classt IN TUTPRAC.CLASS_TIME%TYPE, 
    p_classtp IN TUTPRAC.CLASS_TYPE%TYPE, 
    p_roomnm IN TUTPRAC.ROOMNUM%TYPE) 
IS 
    -- Variables  
    x number:=0; 
    y number:=0; 
    CLASS_CLASH EXCEPTION; 
BEGIN 
    -- checks 
    SELECT nvl((SELECT 1 
       FROM TUTPRAC 
       WHERE UNITCODE = p_unitc and CLASS_DAY = p_classd 
        or CLASS_DAY = p_classd and CLASS_TIME = p_classt 
        and ROOMNUM = p_roomnm) , 0) 
    INTO x FROM dual; 
    SELECT nvl((SELECT 1 
       FROM UNITSTREAM 
       WHERE UNITCODE = p_unitc and DAY = p_classd 
       or DAY = p_classd and TIME = p_classt 
       and LOCATION = p_roomnm) , 0) 
    INTO y FROM dual; 
    -- insert 
    IF (x = 0 and y = 0) THEN 
     INSERT INTO TUTPRAC (CLASSID, UNITCODE, CLASS_DAY, CLASS_TIME, CLASS_TYPE, ROOMNUM) 
     VALUES (p_class, p_unitc, p_classd, p_classt, p_classtp, p_roomnm); 
    ELSE 
     RAISE CLASS_CLASH; 
    END IF; 
EXCEPTION 
     WHEN CLASS_CLASH THEN 
     DBMS_OUTPUT.PUT_LINE('Record was not inserted due to a class clash.'); 
END OPEN_CLASS; 

Когда я запускаю эту процедуру, если запись не имеет каких-либо столкновений он говорит PL/SQL procedure successfully completed. и добавляет запись в таблицу. Проблема в том, что даже если он обнаруживает столкновение, и не делает добавляет запись, он все еще говорит это же сообщение вместо вывода из моего исключения.

+1

Возможный дубликат http://stackoverflow.com/q/6020450/2091410 - см. Первый ответ, который должен помочь. –

ответ

2

Поскольку вы поймаете свое исключение в своей процедуре - процедура не прерывается ненормально. Таким образом, PL/SQL procedure successfully completed. - правильный выход. Чтобы заставить вашу процедуру выдать исключение, вам нужно отправить raise; в блок EXCEPTION.

Если вы не видите сообщение, это может быть из-за того, что выходной сигнал DBMS_OUTPUT подавлен. Проверьте, видите ли вы какой-либо вывод, если вы положили DBMS_OUTPUT.put_line в качестве первой строки вашей процедуры. Если вы этого не сделаете - убедитесь, что вы вызываете SET SERVEROUTPUT ON в своем сеансе sqlplus перед вызовом вашей процедуры.

Смежные вопросы