オンライン・アプリケーション・アップグレードヒント句とは
を見ているとオンライン・アプリケーション・アップグレードのヒント
ってのでいくつかあったけど
なにかよくわからなかったから試してみた。
1.CHANGE_DUPKEY_ERROR_INDEXヒント
INSERT操作およびUPDATE操作時に指定した索引に対して一意キー違反が発生すると、ORA-00001
のかわりにORA-38911
エラーが報告されるみたい。
- テーブル作成して1行追加。
SQL> create table test ( id int,constraint test_pk primary key(id)); Table created. SQL> insert into test values (1); 1 row created. SQL> commit; Commit complete.
で、一意制約違反になるようにヒント句ありとなしでINSERTする。
SQL> insert into test values (1); insert into test values (1) * ERROR at line 1: ORA-00001: unique constraint (ORAUSER.TEST_PK) violated SQL> insert /*+ CHANGE_DUPKEY_ERROR_INDEX(test(id)) */ into test values (1); insert /*+ CHANGE_DUPKEY_ERROR_INDEX(test(id)) */ into test values (1) * ERROR at line 1: ORA-38911: unique constraint (ORAUSER.TEST_PK) violated
ヒント句なしだとORA-00001
だが
ヒント句ありだとORA-38911
になった。
おぉなるほど・・・・。
2.IGNORE_ROW_ON_DUPKEY_INDEXヒント
INSERT操作時に一意制約違反であった場合エラーではなく、処理が継続するらしい。
先ほどのテーブルで試してみる。
ヒント句なしだとおなじみのエラー。
SQL> insert into test values (1); insert into test values (1) * ERROR at line 1: ORA-00001: unique constraint (ORAUSER.TEST_PK) violated
ヒント句ありだとエラーにならずに0 rows created.
が返る。
MySQLのIGNORE
みたいな感じ。MySQLだとDELETE文にも使えるのになー。
SQL> insert /*+ IGNORE_ROW_ON_DUPKEY_INDEX(test(id)) */ into test values (1); 0 rows created.
こんな場合でも一意制約は無視されるみたい。
SQL> insert /*+ IGNORE_ROW_ON_DUPKEY_INDEX(test(id)) */ into test select 1 id from dual union select 2 id from dual; 1 row created. SQL> select * from test; ID ---------- 1 2
これは使えそう。