kenken0807_DBメモ

つば九郎が好きなDBAです。Oracle Standard Editionでの運用やツールとかとかの備忘録。特に記載がない場合はoracle11gR2です。時々MySQL

オンライン・アプリケーション・アップグレードヒント句とは

コメント

を見ているとオンライン・アプリケーション・アップグレードのヒントってのでいくつかあったけど なにかよくわからなかったから試してみた。

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.が返る。
MySQLIGNOREみたいな感じ。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

これは使えそう。