MERGE INTO [schema.]table [alias]
USING {[schema.]table|view|(subquery)} [alias]
ON (column = column [,column=column ...])
WHEN MATCHED THEN
UPDATE SET {column ={column | expression| DEFAULT}}
[,column =...]
WHEN NOT MATCHED THEN
INSERT (column [,column])
VALUES ({column |expression | DEFAULT}[,column ....])
SQL> create table SOURCE_TABLE
(
id number primary key,
COL1 varchar2(10),
COL2 number,
COL3 number
);
Insert few records so that we can see how we can user merge on the target table.
SQL >
begin
insert into source_table values(1,'A',1,1);
insert into source_table values(2,'A',2,1);
insert into source_table values(3,'A',3,1);
insert into SOURCE_TABLE values(4,'B',1,1);
commit;
end;
SQL> CREATE TABLE target_table
(
id NUMBER PRIMARY KEY ,
col1 VARCHAR2( 10 ) ,
COL2 NUMBER ,
COL3 NUMBER ,
MODIFIED_BY VARCHAR2( 100 ) ,
CHANGE_DATE TIMESTAMP ,
change_type VARCHAR2( 100 )
);
SQL> BEGIN
INSERT INTO TARGET_TABLE VALUES(1,'A',1,1,'OTHER USER',SYSDATE-40,'INSERT');
insert into TARGET_TABLE values(2,'A',8,1,'OTHER USER',sysdate-40,'INSERT');
insert into TARGET_TABLE values(3,'A',3,1,'OTHER USER',sysdate-40,'INSERT');
commit;
END;
SQL> select sys_context('USERENV','OS_USER') from dual;
SQL> MERGE INTO target_table tt
USING SOURCE_TABLE st
ON (st.id = tt.id)
WHEN MATCHED THEN
update set
tt.col1 =st.col1,
tt.COL2 = ST.COL2,
TT.COL3 = ST.COL3,
TT.MODIFIED_BY =sys_context('USERENV','OS_USER'),
TT.CHANGE_DATE = sysdate,
tt.CHANGE_TYPE = 'UPDATE'
when not matched then
insert (id,COL1,COL2,COL3,MODIFIED_BY,CHANGE_DATE,CHANGE_TYPE )
values (st.id,ST.COL1,ST.COL2,ST.COL3,sys_context('USERENV','OS_USER'),systimestamp,'INSERT');
Have a question about something in this article? You can receive help directly from the article author. Sign up for a free trial to get started.
Comments (0)