異機種間サービスとゲートウェイは、SQL文の変換または後処理が必要な場合、そのSQL文を書き換えます。
次の例では、Oracle以外のデータベースでINITCAP
関数がサポートされていないことを前提にしています。たとえば、Oracle以外のデータベースから次の操作を要求するプログラムを考えてみます。次に例を示します。
SELECT "COLUMN_A" FROM "test"@remote_db WHERE "COLUMN_A" = INITCAP("COLUMN_B");
INITCAP
関数は、このOracle以外のデータベースでは認識されないため、Oracleデータベース・サーバーは、リモート・データベースのtest
表からデータをフェッチして、ローカルで結果をフィルタします。ゲートウェイは、SELECT
文を次のように書き換えます。
SELECT "COLUMN_A", "COLUMN_B" FROM "test"@remote_db;
問合せ結果がゲートウェイからOracleに送られ、Oracleデータベース・サーバーによりフィルタされます。
前述の例に示した"COLUMN_B"
に文字リテラルまたはバインド変数が指定されている場合、Oracleサーバーの異機種間サービス・コンポーネントは、INITCAP
関数を適用した後に、SQLコマンドをゲートウェイに送信します。たとえば、次のSQLコマンドが発行される場合を考えてみます。
SELECT "COLUMN_A" FROM "test"@remote_db WHERE "COLUMN_A" = INITCAP('jones');
次のSQLコマンドがゲートウェイに送信されます。
SELECT "COLUMN_A" FROM "test"@remote_db WHERE "COLUMN_A" = 'Jones';
次のUPDATE
要求を考えてみます。
UPDATE "test"@remote_db SET "COLUMN_A" = 'new_value' WHERE "COLUMN_A" = INITCAP("COLUMN_B");
この場合、Oracleデータベース・サーバーとゲートウェイはOracle以外のデータベース側のサポートの欠落を補えないため、エラーが発行されます。
前述の例の"COLUMN_B"
に、文字列リテラルまたはバインド変数が指定されている場合、Oracleサーバーの異機種間サービス・コンポーネントは、INITCAP
関数を適用した後に、SQLコマンドをゲートウェイに送信します。たとえば、次のSQLコマンドが発行される場合を考えてみます。
UPDATE "test"@remote_db SET "COLUMN_A" = 'new_value' WHERE "COLUMN_A" = INITCAP('jones');
次のSQLコマンドがゲートウェイに送信されます。
UPDATE "test"@remote_db SET "COLUMN_A" = 'new_value' WHERE "COLUMN_A" = 'Jones';
以前のリリースでは、Oracle以外のデータベースでINITCAP
関数がサポートされていないため、前述のUPDATE
文でエラーが発生していました。