Oracleデータベース・サーバーのSQL構文の処理
異機種間サービスとゲートウェイは、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
文でエラーが発生していました。
- リモート・マップ文に対するデータ型チェックのサポート
異機種環境ではリモート・マップ文に対して完全なデータ型チェックのサポートがあります。
親トピック: 異機種間サービス・エージェントの使用
リモート・マップ文に対するデータ型チェックのサポート
異機種環境ではリモート・マップ文に対して完全なデータ型チェックのサポートがあります。
Oracleデータベースは、同機種環境では常にデータ型チェックおよびデータ型の強制を実行します。たとえば、SELECT * FROM EMP WHERE EMPNO='7934'
は、SELECT * FROM EMPNO WHERE EMPNO=7934
と同じ結果を戻します。異機種環境でも同様に、リモート・マップ文に対して完全なデータ型チェックのサポートがあります。一般的に、SQL文のオペランドは、列、リテラル、バインド変数のいずれであっても、データ型チェックのために内部処理されます。次の例を参考にしてください。
SELECT * FROM EMP@LINK WHERE NUMBER_COLUMN='123' SELECT * FROM EMP@LINK WHERE NUMBER_COLUMN=CHAR_COLUMN; SELECT * FROM EMP@LINK WHERE NUMBER_COLUMN=CHAR_BIND_VARIABLE;
ほとんどのOracle以外のデータベースは、データ型の強制をサポートしていないため、前述の文がそのままOracle以外のデータベースに送信された場合は失敗します。Oracleデータベースの異機種間サービス・コンポーネントは、Oracle以外のデータベースに使用可能な文を送る前に、データ型チェックと必要なデータ型の強制を実行します。
データ型チェックは、処理後の文またはリモート・マップ文に対して一環した動作を提供します。次の2つの文を考えてみます。
SELECT * FROM EMP@LINK WHERE TO_CHAR(EMPNO)='7933' + '1';
および
SELECT * FROM EMP@LINK WHERE EMPNO='7933' + '1';
前述のどちらの文も、Oracle以外のデータベースでTO_CHAR
関数がサポートされているかどうかに関係なく、同じ結果および強制が提供されます。ここで、次の文を考えてみます。
SELECT * FROM EMP@LINK WHERE EMPNO='123abc' + '1';
データ型チェックが実施されているため、Oracle内で強制が試行されるとエラーが発生し、Oracle以外のデータベースに文が送られることなくエラーが戻されます。
つまり、処理後の文であるかリモート・マップ文であるかに関係なく、データ型チェックおよび強制の動作は一貫しています。
親トピック: Oracleデータベース・サーバーのSQL構文の処理