로그 데이타같이 단순히 데이타만 누적시키는 테이블에서
해당 데이타가 있으면 업데이트
없으면 인서트 하는 로직이 많죠..
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;
/
업데이트해봐라 ... 업데이트못했으면 인서트하라는 문구입니다.
디비콜 최소화...
[출처] insert 냐 update 냐... merge into|작성자 수유산장
'DATABASE > 오라클' 카테고리의 다른 글
오라클 import, imp -> impdp : IMP-00038 : Could not convert to environment character set's handle 에러 (2) | 2017.10.20 |
---|---|
오라클 접속오류 : ora-12505, ora-12514 오류 (0) | 2017.10.18 |
오라클 인덱스 리빌드 - index rebuild (0) | 2017.07.05 |
오라클 함수 trim, ltrim, rtrim 에 대해서.. (0) | 2011.03.14 |
오라클 테이블 복사 쿼리 (0) | 2011.01.27 |