database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 38694 게시물 읽기
No. 38694
trigger에서 if 문 문의
작성자
김홍찬(chani282)
작성일
2011-07-13 17:25ⓒ
2011-07-13 17:30ⓜ
조회수
3,522

CREATE OR REPLACE TRIGGER doc_1_trg
   before INSERT OR UPDATE OF bin_id
   ON doc_1
   FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('OLD.bin_id : ' || :OLD.bin_id);
DBMS_OUTPUT.PUT_LINE('NEW.bin_id : ' || :NEW.bin_id);
   IF (:OLD.bin_id <> :NEW.bin_id)
   THEN
DBMS_OUTPUT.PUT_LINE('--1--');
      INSERT INTO doc_his_1 (id,
                                     old_bin_id,
                                     new_bin_id)
           VALUES (:NEW.id,
                   :OLD.bin_id,
                   :NEW.bin_id);
   END IF;
END;
/

insert into doc_1
values('doc-1','bin-1')
;
 

이렇게 하면 분명히 :OLD.bin_id 하고 :NEW.bin_id 하고 다른데 왜 안들어갈까요..?
insert 는 행단위가 아니라 그럴까요? .... 방법이 없을까요?
if~~ 문을 빼면 수행되긴하는데...

 

이 글에 대한 댓글이 총 1건 있습니다.

INSERT의 경우에는 기존의 Row 가 존재하지 않으므로, :OLD 값은 NULL로 처리 됩니다.  오라클 디비에서는, NULL과 어떤 값을 비교 연산자를 사용하여 비교하면, 결과는 항상 FALSE가 됩니다. 

 

따라서, IF (:OLD.bin_id <> :NEW.bin_id) THEN 에서, :OLD.bin_id 와 :NEW.bin_id 중 적어도 하나가 NULL이되면, 조건의 결과는 FALSE가 되어 INSERT INTO doc_his_1 문장이 수행되지 않는 것입니다.

 

다음과 같이 조건을 바꾸면, 원하는 결과를 얻을 수 있을 것입니다.

 

IF ('#' || :OLD.bin_id <> '#' || :NEW.bin_id) THEN 

 

여기서, '#'는 임의의 문자입니다. 

hopper(bunny)님이 2011-07-14 13:44에 작성한 댓글입니다.
이 댓글은 2011-07-14 14:00에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
38698오라클 11g하고 10g 의 차이점 [2]
박상율
2011-07-14
5087
38697GROUP BY 문의 [2]
레이첼
2011-07-13
4121
38696컬럼명과 결과를 세로로 가져오는 SQL [3]
초보
2011-07-13
4390
38694trigger에서 if 문 문의 [1]
김홍찬
2011-07-13
3522
38693쿼리문의 재문의 [1]
레이첼
2011-07-13
3310
38692계층구조입니다. 이틀간삽질하고있네요.
노정균
2011-07-13
3872
38691구분자가 없는 데이타 sqlldr 시에 오류 질문 입니다. [3]
김용남
2011-07-13
6207
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다