サポートされているDMLと例

Oracle Globally Distributed DatabaseのDMLは、重複表またはシャード表のいずれかをターゲットにできます。ターゲットが重複表の場合、DMLに制限はありません。

シャード表をターゲットとするDML (主に挿入、更新および削除)は、次のようにできます。

  • ターゲット表のみが参照される単純なDML
  • 他の表を参照するDML
  • MERGE文

ターゲット表のみが参照される単純なDML

次に、サポートされているDMLの例をいくつか示します。

例8-13 すべての行の更新

UPDATE employees SET salary = salary *1.1;

例8-14 単一行の挿入

INSERT INTO employees VALUES (102494, 'Jane Doe, ...
    );

例8-15 単一行の削除

DELETE employees WHERE employee_id = 103678;

他の表を参照するDML

シャード表のDMLは、他のシャード表、重複表またはローカル表を参照できます。

例8-16 重複表を参照するDML

この例では、employeesはシャード表で、ref_jobsは重複表です。

DELETE employees
            WHERE job_id IN (SELECT job_id FROM ref_jobs
                            WHERE job_id = 'SA_REP');

例8-17 別のシャード表を参照するDML

UPDATE departments SET department_name = 'ABC‘
            WHERE department_id IN (SELECT department_id
                                    FROM employees
                                    WHERE salary < 10000);

例8-18 ローカル表からのINSERT AS SELECT

INSERT INTO employees SELECT * FROM local_employees;

例8-19 1つのシャードに影響するDML

DML文は、1つのシャードのみに影響することも、複数のシャードに影響することもあります。たとえば、ここに示すDELETE文は、WHERE句のシャーディング・キー(employee_id)に述語があるため、1つのシャードにのみ影響します。

DELETE employees WHERE employee_id = 103678;

例8-20 複数のシャードに影響するDML

次の文は、WHERE句がないため、EMPLOYEES表のすべての行に影響します。

UPDATE employees SET salary = salary *1.1;

このUPDATE文をすべてのシャードで実行するために、シャード・コーディネータがすべてのプライマリ・データベースに対して反復処理を行い、UPDATE文をリモートに呼び出します。コーディネータは分散トランザクションを開始し、2フェーズ・コミットを実行して分散トランザクションの一貫性を保証します。インダウト・トランザクションがある場合は、手動でリカバリする必要があります。

MERGE文の例

MERGE文で、シャード表または重複表をターゲットにできます。MERGE操作自体をシャードにプッシュできるかぎり、マージは許可されます。

例8-21 シャード表employeesをターゲット表とするMerge文

この例では、employee_id列がシャーディング・キーで、ソース問合せの結合述語がシャーディング・キーにあるため、MERGE文は処理されるすべてのシャードにプッシュされます。

MERGE INTO employees D
   USING (SELECT employee_id, salary, department_id FROM employees
   WHERE department_id = 80) S
   ON (D.employee_id = S.employee_id)
   WHEN MATCHED THEN UPDATE SET D.salary = D.salary + S.salary*.01
     DELETE WHERE (S.salary > 8000)
   WHEN NOT MATCHED THEN INSERT (D.employee_id, D.salary)
     VALUES (S.employee_id, S.salary*0.1)
     WHERE (S.salary <= 8000);

例8-22 重複表をターゲット表とするMerge文

この例では、ターゲット表は重複表ref_employeesです。ソース問合せはシャード表employeesを参照し、結合述語はシャーディング・キーemployee_idにあります。

MERGE INTO ref_employees D
   USING (SELECT employee_id, salary, department_id FROM employees
   WHERE department_id = 80) S
   ON (D.employee_id = S.employee_id)
   WHEN MATCHED THEN UPDATE SET D.salary = D.salary + S.salary*.01
     DELETE WHERE (S.salary > 8000)
   WHEN NOT MATCHED THEN INSERT (D.employee_id, D.salary)
     VALUES (S.employee_id, S.salary*0.1)
      WHERE (S.salary <= 8000);

マルチシャードDMLのサポートの制限事項

次のDML機能は、Oracle Globally Distributed DatabaseのマルチシャードDMLではサポートされません。

  • エラー・ロギング DMLのERROR LOG句は、マルチシャードDMLではサポートされません。この場合、ユーザー・エラーが発生します。
  • 配列DML 配列DMLはマルチシャードDMLではサポートされません。この場合、ORA-2681が発生します。
  • RETURNING句RETURNING INTO句は通常の分散DMLでサポートされないため、サポートされません。マルチシャードDMLでRETURNING INTO句の使用を試みると、ORA-22816が発生します。
  • MERGEおよびUPSERT MERGE文は部分的にサポートされます。つまり、単一のシャードのみに影響を与えるMERGE文はサポートされます。MERGE文で複数のシャードの変更が必要となる場合は、ORAエラーが発生します。
  • 複数表へのINSERT複数表への挿入はデータベース・リンクでサポートされないため、複数表への挿入はサポートされていません。
  • 更新可能な結合ビュー 更新可能な結合ビューでシャード表がシャーディング・キーで結合されている場合、ORA-1779がスローされます。このエラーの理由は、シャード表に定義されている主キーが内部列SYS_HASHVAL + シャーディング・キーの組合せであるため、更新可能な結合ビューにSYS_HASHVALを指定できないからです。この制限により、キー保存表を設定できないため、ORA-1779が発生します。
  • トリガー