Oracle以外のデータベースに対するユーザー定義関数の実行

Oracle以外のリモート・データベースでユーザー定義関数を実行できます。

次に例を示します。

SELECT getdeptforemp@Remote_DB(7782) FROM dual;

この例では、リモート・データベース内でユーザー定義関数が実行され、従業員7782に関する部門情報を戻すSELECT文が発行されています。

リモート関数がOracleデータベース内にある場合、Oracleデータベースでは、リモート関数によりデータベースの状態(データベースの行やPL/SQLパッケージの状態など)が更新されないことが自動的に確認されます。リモート関数がOracle以外のデータベースに常駐している場合、ゲートウェイではこのことを確認できません。したがって、ユーザーは、どのデータベースにおいてもユーザー定義関数により状態が更新されないように確認する必要があります。この確認が必要となるのは、読取り一貫性を保証するためです。

セキュリティ対策として、リモートで実行する関数とその所有者を、ゲートウェイ固有の初期化パラメータ・ファイルのHS_CALL_NAMEパラメータで指定する必要があります。次に例を示します。

HS_CALL_NAME = "owner1.A1, owner2.A2 "

owner1owner2は、リモート関数の所有者名です。A1A2は、リモート関数名です。リモート関数の所有者をSQL文で指定する必要はありません。リモート関数は、デフォルトでDatabase Gatewayの接続先スキーマに常駐する必要があります。他の場所に常駐する場合は、リモート関数の所有者をSQL文で指定してください。

ユーザー定義のリモート関数のその他の実行例を次に示します。

  • 副問合せ内のリモート関数

    次の関数は、employee_id列のデータを使用して、リモート・データベースのEMPLOYEES表からdepartment_idを取得します。外部問合せにより、戻されたリストと一致するリモート・データベース内の部門番号がすべて判別されます。

    SELECT * FROM departments@remotedb
      WHERE department_id IN
         (SELECT
          getdeptforemp@remotedb (employee_id)
          FROM employees@remotedb);
    
  • ユーザー定義リモート関数の結果に対するローカル関数の適用

    次の問合せでは、リモート・データベース上の全従業員の最大給与が戻されます。

    SELECT max (getsalforemp@remotedb (employee_id))
       FROM employees@remotedb;
    
  • DML文

    次の文では、リモート・データベース内のユーザー定義問合せからの出力を使用して、salary列が新規給与情報で更新されます。

    UPDDATE employee_history
       SET salary = emp_changed_salary@remote_db;
    

前述の例では、OracleデータベースはDatabase Gatewayに関数名と所有者を渡します。ユーザー定義関数はリモート・データベース上で実行されます。