-- 위의 방법은 되질 않습니다. 비교를 못하고 있습니다.DBMS_OUTPUT.PUT_LINE('겹칩니다.');END IF;END;
DBMS_OUTPUT.PUT_LINE('겹칩니다.');
DBMS_OUTPUT.PUT_LINE('겹치지 않습니다.');
처음 하신거..
지금 트리거는 행단위로 적용되므로
update 트리거라면 old 와 new 가 있겠지만 인서트 상황이면 old 는 없고 new 만 있을테니까
당연히 비교가 안될거구요
두번째꺼
만들어주신거 그대로 수행하면 ora-04091 에러가 납니다.
지금 수정 중에 있는 데이터를 트리거에서 또 참조한다는... 대강 그런 내용인데,
트리거가 after insert 상황에서 작동하니 select 절에서 발생합니다. 방금 집어 넣고 트렌젝션 중인 데이터가 = :NEW.START_DATE 조건에 걸리니까요.
insert 되기 전에 비교를 먼저 하고 조건 분기 처리해야 하므로 before insert 로 변경하시면 됩니다.
그 다음에 START_DATE = :NEW.START_DATE 인 데이터가 없는 상황이면 cdate 에 아무것도 담기지를 않으니 no data... 뭐라고 하는 에러가 뜹니다. count 로 위 상황 커버 해 주시면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | -- 0. 테이블 생성 -- CREATE TABLE test(dt VARCHAR2(8)); CREATE INDEX x01_test ON test(dt); -- 0. 패키지에서 변경된 자료를 저장할 변수 정의 -- CREATE OR REPLACE PACKAGE pkg_test IS TYPE type_dt IS TABLE OF test.dt%TYPE INDEX BY BINARY_INTEGER; v_dt type_dt; i BINARY_INTEGER; END ; / -- 1. 문장-트리거 에서 의 DML 실행전 패키지 변수 초기화 -- CREATE OR REPLACE TRIGGER tri_test_1 BEFORE INSERT ON test BEGIN pkg_test.i := 0; END ; / -- 2. 행-트리거 에서 패키지 변수에 변경된 값을 저장 -- CREATE OR REPLACE TRIGGER tr_test_2 BEFORE INSERT ON test FOR EACH ROW BEGIN pkg_test.i := pkg_test.i + 1; pkg_test.v_dt(pkg_test.i) := :new.dt; END ; / -- 3. 문장-트리거 에서 의 DML 실행후 별도 DML 처리 -- CREATE OR REPLACE TRIGGER tr_test_3 AFTER INSERT ON test DECLARE v_cnt NUMBER(1); BEGIN FOR i IN 1..pkg_test.i LOOP SELECT COUNT (*) INTO v_cnt FROM test WHERE dt = pkg_test.v_dt(i) AND ROWNUM <= 2 ; IF v_cnt = 2 THEN DBMS_OUTPUT.PUT_LINE(pkg_test.v_dt(i) || ' : 겹칩니다.' ); ELSE DBMS_OUTPUT.PUT_LINE(pkg_test.v_dt(i) || ' : 겹치지 않습니다.' ); END IF; END LOOP; END ; / -- 입력 테스트 -- INSERT INTO test VALUES ( '20130101' ); 20130101 : 겹치지 않습니다. 1 개의 행이 만들어졌습니다. INSERT INTO test VALUES ( '20130102' ); 20130102 : 겹치지 않습니다. 1 개의 행이 만들어졌습니다. INSERT INTO test VALUES ( '20130102' ); 20130102 : 겹칩니다. 1 개의 행이 만들어졌습니다. |