-MERGE文は条件により、データーの追加、更新、削除を一気にできる。
-該当行が存在する場合、UPDATE(DELETEを含められる)を実施し、
新しい行の場合INSERTを実施する。
-対象テーブルに対するUPDATE/INSERT条件はON~により決定される。
-MERGE文でCLOB使用時、アップデートする内容が2000bytesが超えると
ORA-00600エラーが発生し、patch set 11.2.0.2バージョンで解決できる。
■MERGE Syntax
MERGE [hint]
INTO [schema.]{table | view} [t_alias]
USING { [schema.]{table|view}
| subquery
} [t_alias]
ON (condition)
WHEN MATCHED THEN
UPDATE SET column = { expr | DEFAULT }
[, column = { expr | DEFAULT }]...
[DELETE where_clause]
WHEN NOT MATCHED THEN
INSERT [(column [, column]...)]
VALUES ({ expr [, expr]... | DEFAULT})
-INTO:DATAをUPDATE、INSERTされるテーブルまたはビューを指定。
-USING:比較するSOURCEテーブルまたはビュー、サブクエリを指定。
-ON:UPDATE、INSERTをする条件で、該当条件を果たすDATAがあればWHEN MATCED句を実施、
なければWHEN NOT MATCHED以下を実施する。
-WHEN MATCHED:ON条件句がTRUEであるROWに実施する内容(UPDATE,DELETEも可能)
-WHEN NOT MATCHED:ON条件句に合うROWがない場合実施する内容(INSERT)
■MERGE例1
--部署番号20,30の社員が存在すれば給与を10%アップする。
存在しなければ給与が1000より多い社員情報を登録する。(INSERT, UPDATE)
--部署番号10,20の社員情報を持つテーブルを作成
SQL> CREATE TABLE emp_merge_test
2 AS SELECT empno, deptno, sal FROM emp WHERE deptno IN (10, 20);
表が作成されました。
--データーの確認
SQL> SELECT * FROM emp_merge_test;
EMPNO DEPTNO SAL
---------- ---------- ----------
7369 20 800
7566 20 2975
7782 10 2450
7788 20 3000
7839 10 5000
7876 20 1100
7902 20 3000
7934 10 1300
8行が選択されました。
--社員が存在すれば給与10%UP、なければINSERT
SQL> MERGE INTO emp_merge_test m
2 USING ( SELECT empno, deptno, sal
3 FROM emp
4 WHERE deptno IN (20,30)) e
5 ON (m.empno = e.empno)
6 WHEN MATCHED THEN
7 UPDATE SET m.sal = ROUND(m.sal*1.1)
8 WHEN NOT MATCHED THEN
9 INSERT (m.empno, m.deptno, m.sal)
10 VALUES (e.empno, e.deptno, e.sal)
11 WHERE e.sal > 1000
12 ;
10行がマージされました。
--部署番号20の社員達の給与が20%UPされて、部署番号30が登録されているか確認
SQL> SELECT * FROM emp_merge_test;
EMPNO DEPTNO SAL
---------- ---------- ----------
7369 20 880
7566 20 3273
7782 10 2450
7788 20 3300
7839 10 5000
7876 20 1210
7902 20 3300
7934 10 1300
7844 30 1500
7698 30 2850
7499 30 1600
EMPNO DEPTNO SAL
---------- ---------- ----------
7521 30 1250
7654 30 1250
13行が選択されました。
--次の例のため30部署のデーターを削除
SQL> DELETE FROM emp_merge_test WHERE deptno = 30;
5行が削除されました。
SQL> COMMIT;
コミットが完了しました。
■MERGE例2
--10部署の給与を10%UPし20部署の社員情報は削除、30部署の給与を30%UPする(INSERT,UPDATE,DELETE)
--データーの確認
SQL> SELECT * FROM emp_merge_test m;
EMPNO DEPTNO SAL
---------- ---------- ----------
7369 20 880
7566 20 3273
7782 10 2450
7788 20 3300
7839 10 5000
7876 20 1210
7902 20 3300
7934 10 1300
8行が選択されました。
--MERGE文作成
SQL> MERGE INTO emp_merge_test m
2 USING emp e
3 ON (m.empno = e.empno)
4 WHEN MATCHED THEN
5 UPDATE SET m.sal = ROUND(m.sal*1.1)
6 DELETE WHERE (m.deptno = 20)
7 WHEN NOT MATCHED THEN
8 INSERT (m.empno, m.deptno, m.sal)
9 VALUES (e.empno, e.deptno, ROUND(e.sal*1.2));
14行がマージされました。
--変更後の確認
SQL> SELECT * FROM emp_merge_test;
EMPNO DEPTNO SAL
---------- ---------- ----------
7782 10 2695
7839 10 5500
7934 10 1430
7844 30 1800
7521 30 1500
7654 30 1500
7698 30 3420
7499 30 1920
7900 30 1140
9行が選択されました。
--テストテーブルの削除
SQL> DROP TABLE emp_merge_test;
表が削除されました。
SQL>
0 件のコメント:
コメントを投稿