프로그램을 개발하면
특정 테이블에 데이터를 넣거나 아니면 수정하거나 할일이 있다.
보통 개발을 하게되면
개발 언어로 해당 데이터가 있는지 없는지 확인(select 실행)을 하고
데이터가 있으면 수정 ( update 실행 )
데이터가 없으면 삽입 ( insert 실행 )
이런류의 작업을 주로 한다.
이 작업이 조금 개선이 되면
처음부터 데이터를 수정(update 실행)을 시도 하거나 삽입(insert 실행)을 시도한다.
그리고나서 그결과가 실패면 반대의 작업을 한다.
이런 작업을 프로그램상에서 select 문, update 문 , insert 문을 실행하는것보다.
한번에 해당 요청을 한번에 해서 오라클자체 내에서 처리하는것이 이득일것이라고
본다.
오라클에서는 merge 라는 기능으로 이러한 작업을 SQL문으로 편하게 처리할수있도록
하여 성능은 향상이 되고 , 프로그램상의 코딩량을 줄여준다.
특정의 한테이블에 데이터를 수정및 삽입을 할경우는 USING 에 DUAL을 쓴다.
MERGE INTO 테이블명
USING DUAL
ON ( 조건 )
WHEN MATCHED THEN
UPDATE SET
WHEN NOT MATCHED THEN
INSERT (컬럼명1,컬럼명2)
VALUES(값1,값2);
테이블 A와 테이블 B를 비교하여
데이터가 있으면 삽입 , 없으면 수정 한다.
MERGE INTO 테이블명
USING 조인테이블
ON ( 테이블명.column = 조인테이블.column )
WHEN MATCHED THEN
UPDATE SET
WHEN NOT MATCHED THEN
INSERT (컬럼명1,컬럼명2)
VALUES(값1,값2);
예제)
jobs 테이블 조회.
JOB_ID JOB_TITLE MIN_SALARY MAX_SALARY
---------- ----------------------------------- ---------- ----------
AD_PRES President 20000 40000
AD_VP Administration Vice President 15000 30000
AD_ASST Administration Assistant 3000 6000
AC_MGR Accounting Manager 8200 16000
AC_ACCOUNT Public Accountant 4200 9000
SA_MAN Sales Manager 10000 20000
SA_REP Sales Representative 6000 12000
ST_MAN Stock Manager 5500 8500
ST_CLERK Stock Clerk 2000 5000
IT_PROG Programmer 4000 10000
MK_MAN Marketing Manager 9000 15000
JOB_ID JOB_TITLE MIN_SALARY MAX_SALARY
---------- ----------------------------------- ---------- ----------
MK_REP Marketing Representative 4000 9000
12 rows selected.
SQL>
##################### MERGE INTO insert 일경우 #######################
declare
n_job_id jobs.job_id%type;
n_job_title jobs.job_title%type;
begin
/* BABO 라는 job_id 가 없기때문에 insert 를 한다. */
n_job_id := 'BABO';
n_job_title := 'STUDY MAN';
merge into jobs
using DUAL
on ( job_id = n_job_id )
when matched then
update set
job_title = n_job_title
when not matched then
insert (job_id,job_title)
values (n_job_id, n_job_title);
end;
/
결과
SQL> select *From jobs;
JOB_ID JOB_TITLE MIN_SALARY MAX_SALARY
---------- ----------------------------------- ---------- ----------
BABO STUDY MAN
AD_PRES President 20000 40000
AD_VP Administration Vice President 15000 30000
AD_ASST Administration Assistant 3000 6000
##################### MERGE INTO update 일경우 #######################
declare
n_job_id jobs.job_id%type;
n_job_title jobs.job_title%type;
begin
/* AC_ACCOUNT라는 job_id 가 있기때문에 update 를 한다. */
n_job_id := 'AC_ACCOUNT';
n_job_title := 'TEST';
merge into jobs
using DUAL
on ( job_id = n_job_id )
when matched then
update set
job_title = n_job_title
when not matched then
insert (job_id,job_title)
values (n_job_id, n_job_title);
end;
/
결과 )
SQL> select *From jobs where job_id = 'AC_ACCOUNT';
JOB_ID JOB_TITLE MIN_SALARY MAX_SALARY
---------- ----------------------------------- ---------- ----------
AC_ACCOUNT TEST 4200 9000
SQL>
'Oracle > 오라클 양성반 15기' 카테고리의 다른 글
SYSOPER (0) | 2010.09.28 |
---|---|
dbca. script, template 이것저것 (0) | 2010.09.12 |
pl/sql exception (0) | 2010.09.12 |
composite data type , cursor (0) | 2010.09.12 |
for update (0) | 2010.09.12 |