2014-12-02 4 views
0

저는 Oracle을 배우고 before 트리거를 구현하려고합니다. 내가 올바른 코드를 가지고 생각하지만 일단 트리거를 호출하거나 가져 오지 않는 삽입 문을 실행하지만, 행은 여전히 ​​테이블에 삽입됩니다. 아무도 내가 뭘 잘못하고 있는지 알 수 없으며 방아쇠가 작동하지 않는 이유를 알고 있습니까? SQL before 트리거가 작동하지 않습니다.

내가이 나는 날이

insert into ad_slot values (78955, 'testday', 'ER', 'House', 'Taken', 7654321, '05=FEB-2014 21:00:00'); 

테스트 케이스 유효하지 않은 한, 그것은 예외를 발생한다으로 테스트하고 삽입 성명

create or replace 
TRIGGER DAY_CHECK BEFORE 
    INSERT ON AD_SLOT FOR EACH ROW DECLARE p_day AD_SLOT.DAY_OF_WEEK%TYPE; 
    NOTVALID EXCEPTION; 
    BEGIN 
    IF p_day IN ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday') THEN 
     DBMS_OUTPUT.PUT_LINE('VALID DAY'); 
    ELSE 
     RAISE NOTVALID; 
    END IF; 
EXCEPTION 
WHEN NOTVALID THEN 
    DBMS_OUTPUT.PUT_LINE('NOT A VALID DAY'); 
    RAISE; 
END; 

을 사용하고있는 트리거입니다 중고

INSERT INTO ad_slot (DAY_OF_WEEK) VALUES ('unwanted day'); 
+0

'p_day'에 값을 할당하지 마십시오. 또한 트리거에서'commit' 또는 rollback'을 사용할 수 없습니다. –

+0

사용자가 입력 한 값에 어떻게 할당합니까? – Hayes121

+0

또는 'day_of_week을 p_day from ad_slot'으로 선택 하시겠습니까? – Hayes121

답변

0

RAISE을 입력해야합니다.원하지 않는 요일에 INSERT이 작동하지 않도록 차단하십시오. 그렇지 않으면 행이 삽입됩니다.

SQL> CREATE TABLE ad_slot(day_of_week VARCHAR2(20)); 

Table created. 

SQL> CREATE OR REPLACE TRIGGER DAY_CHECK BEFORE 
    2 INSERT ON AD_SLOT FOR EACH ROW DECLARE p_day AD_SLOT.DAY_OF_WEEK%TYPE; 
    3 NOTVALID EXCEPTION; 
    4 BEGIN 
    5  IF p_day IN ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday') THEN 
    6  DBMS_OUTPUT.PUT_LINE('VALID DAY'); 
    7  ELSE 
    8  RAISE NOTVALID; 
    9  END IF; 
10 EXCEPTION 
11 WHEN NOTVALID THEN 
12  DBMS_OUTPUT.PUT_LINE('NOT A VALID DAY'); 
13  RAISE; 
14 END; 
15/

Trigger created. 

SQL> 
SQL> INSERT INTO ad_slot VALUES ('unwanted day'); 
NOT A VALID DAY 
INSERT INTO ad_slot VALUES ('unwanted day') 
      * 
ERROR at line 1: 
ORA-06510: PL/SQL: unhandled user-defined exception 
ORA-06512: at "LALIT.DAY_CHECK", line 12 
ORA-04088: error during execution of trigger 'LALIT.DAY_CHECK' 


SQL> 
+0

답장을 보내 주셔서 감사합니다.하지만이 코드를 실행하려고하면 'ORA-06512 : at "DT2113A.DAY_CHECK ", line 11 ORA-04088 : 'DT2113A.DAY_CHECK'트리거 실행 중 오류가 발생했습니다. – Hayes121

+0

전체 오류 스택을 게시하십시오. –

+0

명령어에서 254 번째 줄부터 시작하는 중에 오류가 발생했습니다. ad_slot 값에 삽입하십시오 (78955, '월요일', 'ER', '집', 'Taken', 7654321, '05 = FEB-2014 21:00:00 ') 오류 보고서 : SQL 오류 : ORA-20001 : 프로그램 기간이 충분하지 않습니다. ORA-06512 : "DT2113A.DAY_CHECK"줄 11에 있음 ORA-04088 : 'DT2113A.DAY_CHECK'트리거 실행 중 오류가 발생했습니다. – Hayes121

관련 문제