본문 바로가기

Oracle/오라클 양성반 15기

merge into

프로그램을 개발하면

특정 테이블에 데이터를 넣거나 아니면 수정하거나 할일이 있다.

 

보통 개발을 하게되면

개발 언어로 해당 데이터가 있는지 없는지 확인(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