重複したパラメータ名

次のSQL文について考えてみます。

SELECT * FROM t1 WHERE c1=:a AND c2=:a AND c3=:b AND c4=:a;

通常、TimesTenでは、SQL文において同じパラメータ名のインスタンスが複数存在する場合、同じパラメータが複数出現しているとみなされます。パラメータにパラメータ番号を割り当てる場合、TimesTenでは、各パラメータ名の最初の出現に対してのみパラメータ番号が割り当てられます。特定の名前が2回目以降に出現しても、独自のパラメータ番号は割り当てられません。この場合、TimesTenアプリケーションは、SQL文における一意のパラメータすべてに対して値をバインドします。同じパラメータ名の異なる出現に対して別の値をバインドしたり、パラメータやパラメータの出現をバインドしないでおくことはできません。

Oracle Databaseでは、SQL文において同じパラメータ名のインスタンスが複数存在する場合、異なるパラメータとしてみなされます。パラメータ番号を割り当てる場合、Oracle Databaseでは名前の重複にかかわらず、パラメータが出現するたびに番号が割り当てられます。Oracle Databaseアプリケーションは、少なくとも、各パラメータ名の最初の出現に対して値をバインドします。特定のパラメータがこれ以降に出現した場合は、アプリケーションはパラメータの出現をバインドしないでおくことも、この出現に対して異なる値をバインドすることもできます。

次の表に、各パラメータに対してTimesTenおよびOracle Databaseによって割り当てられるパラメータ番号を伴う問合せを示します。

問合せ TimesTenのパラメータ番号 Oracle Databaseのパラメータ番号

SELECT *

該当なし

該当なし

FROM t1

該当なし

該当なし

WHERE c1=:a

1

1

AND c2=:a

1

2

AND c3=:b

2

3

AND c4=:a;

1

4

この例におけるTimesTenのパラメータ番号の合計数は2です。この例におけるOracle Databaseのパラメータの合計数は4です。アプリケーションで指定されたパラメータ・バインディングによって、従来のTimesTenの動作とOracle Databaseの動作とでは異なる結果となります。

DuplicateBindMode一般接続属性を使用すると、SQL文においてパラメータが重複して出現した場合に、アプリケーションで従来のTimesTenのパラメータ・バインディングを使用するか、またはOracleスタイルのパラメータ・バインディングを使用するかを指定できます。デフォルトでは、Oracleスタイルのパラメータ・バインディングが指定されています。