oracle merge 9 iから10 gまでの強化
4159 ワード
MERGE文は、UPDATE文とINSERT文を統合するOracle 9 iの新しい構文です.接続条件マッチング上のUPDATEを行い、マッチングできない実行INSERT.この構文は1回のフルテーブルスキャンですべての作業を完了し,実行効率はINSERT+UPDATEより高い.
具体例を見てみましょう.
例を少し修正します.
このエラーはMERGEを使用する最も一般的なエラーです.このエラーの原因は、接続条件によって得られるソーステーブルのレコードが一意ではないためです.merge intoではkey値を設定する必要があり、このkey値に基づいてmerge intoの操作(updateかinsert intoか)が決定されるので、mergeではこのkey値が一意であることが要求される.したがって、ソーステーブルからすべてのデータを選択し、key値が一意である必要があります.
もう1つのエラーもよくあります.
10 g拡張1:where句
次の例を示します.
10 g強化二:delete句
具体例を見てみましょう.
hr@ORCL> select * from p;
ID NAME
---------- ----------
1 d
3 e
8 f
hr@ORCL> select * from t;
ID NAME
---------- ----------
1 a
2 b
3 c
hr@ORCL> merge into t using p
2 on (t.id=p.id)
3 when matched then
4 update set
5 t.name=p.name
6 when not matched then
7 insert values
8 (p.id,p.name)
9 ;
3 rows merged.
hr@ORCL> select * from t;
ID NAME
---------- ----------
1 d
2 b
3 e
8 f
hr@ORCL> commit;
Commit complete.
例を少し修正します.
hr@ORCL> insert into p values(1,'h');
1 row created.
hr@ORCL> commit;
Commit complete.
hr@ORCL> merge into t using p
2 on (t.id=p.id)
3 when matched then
4 update set
5 t.name=p.name
6 when not matched then
7 insert values
8 (p.id,p.name)
9 ;
merge into t using p
*
ERROR at line 1:
ORA-30926: unable to get a stable set of rows in the source tables
このエラーはMERGEを使用する最も一般的なエラーです.このエラーの原因は、接続条件によって得られるソーステーブルのレコードが一意ではないためです.merge intoではkey値を設定する必要があり、このkey値に基づいてmerge intoの操作(updateかinsert intoか)が決定されるので、mergeではこのkey値が一意であることが要求される.したがって、ソーステーブルからすべてのデータを選択し、key値が一意である必要があります.
もう1つのエラーもよくあります.
hr@ORCL> create table mm (id number,name varchar2(10));
Table created.
hr@ORCL> create table mn (id number,name varchar2(10));
Table created.
hr@ORCL> insert into mm values(1,'A');
1 row created.
hr@ORCL> insert into mn values(1,'B');
1 row created.
hr@ORCL> merge into mn using mm
2 on (mn.id=mm.id)
3 when matched then
4 update set mn.id=mm.id
5 when not matched then
6 insert values
7 (mm.id,mm.name);
on (mn.id=mm.id)
*
ERROR at line 2:
ORA-38104: Columns referenced in the ON Clause cannot be updated: "MN"."ID"
10 g拡張1:where句
次の例を示します.
hr@ORCL> select * from p;
ID NAME
---------- ----------
1 d
2 f
7 g
hr@ORCL> select * from t;
ID NAME
---------- ----------
1 a
2 b
3 c
hr@ORCL> merge into t using p
2 on (p.id=t.id)
3 when matched then
4 update set
5 t.name=p.name
6 where p.id=2;
1 row merged.
hr@ORCL> select * from t;
ID NAME
---------- ----------
1 a
2 f
3 c
10 g強化二:delete句
hr@ORCL> select * from p;
ID NAME
---------- ----------
1 d
2 f
7 g
hr@ORCL> select * from t;
ID NAME
---------- ----------
1 a
2 f
3 c
hr@ORCL> merge into t using p
2 on (p.id=t.id)
3 when matched then
4 update set
5 t.name=p.name
6 delete where
7 (t.id=2);
2 rows merged.
hr@ORCL> select * from t;
ID NAME
---------- ----------
1 d
3 c