로그 데이타같이 단순히 데이타만 누적시키는 테이블에서 

해당 데이타가 있으면 업데이트 

없으면 인서트 하는 로직이 많죠..


asp라면 쉽게 생각하는 방법이

select 문을 써서 eof 면 인서트 eof가 아니면 업데이트 하는 소스를 생각하기 쉽죠..

그런데 구지 select를 해서 recordset에 담아야 할까요? 이런 로직은 디비콜이 2번일수 밖에 없죠.
게다가 select 당시에는 데이타가 없다가 인서트전에 데이타가 들어간경우... 중복데이타가 생기거나 PK오류로 sql에러가 뜨겠죠.. 


9i이후부터는 merge문을 지원합니다.


테스트 테이블 생성

CREATE TABLE TEST_LOG(

LOG_DATE VARCHAR2(10),

TOTAL NUMBER DEFAULT 1

)


merge 문

MERGE INTO TEST_LOG

USING DUAL B 

ON (LOG_DATE = '2011/09/16') 

WHEN MATCHED THEN 

 UPDATE SET TOTAL = TOTAL + 1 

WHEN NOT MATCHED THEN 

 INSERT (LOG_DATE,TOTAL) 

 VALUES ('2011/09/16',1)

;


한번의 콜로 업데이트 또는 인서트를 실행하게 됩니다.


그럼 9i버전 이전은 어떻게...

PL/SQL문을 사용할수 밖에 없겠죠..


UPDATE TEST_LOG

SET  TOTAL = TOTAL + 1

WHERE LOG_DATE = '2011/09/15';

IF SQL%NOTFOUND THEN

INSERT INTO TEST_LOG(LOG_DATE,TOTAL)

VALUES('2011/09/15',1);

END IF;

END;

/


업데이트해봐라 ... 업데이트못했으면 인서트하라는 문구입니다.


디비콜 최소화...

+ Recent posts