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以外のデータベースに文が送られることなくエラーが戻されます。
つまり、処理後の文であるかリモート・マップ文であるかに関係なく、データ型チェックおよび強制の動作は一貫しています。