重複したパラメータ名
次の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のパラメータ番号 |
|---|---|---|
|
|
該当なし |
該当なし |
|
|
該当なし |
該当なし |
|
|
1 |
1 |
|
|
1 |
2 |
|
|
2 |
3 |
|
|
1 |
4 |
この例におけるTimesTenのパラメータ番号の合計数は2です。この例におけるOracle Databaseのパラメータの合計数は4です。アプリケーションで指定されたパラメータ・バインディングによって、従来のTimesTenの動作とOracle Databaseの動作とでは異なる結果となります。
DuplicateBindMode一般接続属性を使用すると、SQL文においてパラメータが重複して出現した場合に、アプリケーションで従来のTimesTenのパラメータ・バインディングを使用するか、またはOracleスタイルのパラメータ・バインディングを使用するかを指定できます。デフォルトでは、Oracleスタイルのパラメータ・バインディングが指定されています。