動的パラメータを置ける場所

データ型が簡単に決定される場所であれば、式の何処にでも動的パラメータを置くことができます。

  1. BETWEENでは、二つ目と三つ目のオペランドのどちらかが動的パラメータでなければ、最初のオペランドを動的パラメータとすることができます。 一つ目のオペランドの型は、残りの二つが動的パラメータでなければ、それら動的ではないパラメータの型もしくはそれらを統合した型とみなされます。 WHERE ? BETWEEN DATE('1996-01-01') AND ? -- 型はDATEとみなされます。
  2. BETWEENの二つ目、三つ目のオペランドを動的パラメータとすることができます。 これらの型は左辺のオペランドと同じ型とみなされます。WHERE DATE('1996-01-01') BETWEEN ? AND ? -- 型はDATEとみなされます。
  3. INでは一覧のうち一つでも動的パラメータではない項目があれば、左辺のオペランドを動的パラメータとすることができます。 左辺のオペランドの型は一覧にある動的でないパラメータの項目の型を統合した型とみなされます。WHERE ? NOT IN (?, ?, 'Santiago') -- 型はCHARとみなされます。
  4. INでは、最初のオペランドが動的パラメータではないか前掲のルールによりその型が決まる場合、INの述部の一覧に動的パラメータを置くことができます。 値の一覧に置かれた動的パラメータの型は、左辺のオペランドの型と同じものとみなされます。 WHERE FloatColumn IN (?, ?, ?) -- 型はFLOATとみなされます。
  5. オペランドを2つ持つ演算子の、+・-・*・/・AND・OR・<・>・ =・<・>・<=と>=では、片方のオペランドを動的パラメータとすることができますが、両方を動的パラメータとすることはできません。 動的パラメータの型はもう片方のオペランドの型となります。 WHERE ? < CURRENT_TIMESTAMP -- 型はTIMESTAMPとみなされます。
  6. CASTでは常に動的パラメータを利用できます。これにより動的パラメータに型を与えることができます。 CALL valueOf(CAST (? AS VARCHAR(10)))
  7. LIKE演算子の片方あるいは両方のオペランドを動的パラメータとすることが可能です。 左辺を動的パラメータとした場合、その型は右辺のオペランドと同じものとみなされます。なお最大長は型の最大長となります。右辺を動的パラメータとした場合、左辺のオペランドの長さと型が適用されます。 (LIKEではCHARとVARCHARの型を利用する事が可能です。詳細はを参照してください。) WHERE ? LIKE 'Santi%' --型は最大長がjava.lang.Integer.MAX_VALUEの --CHARとみなされます。
  8. 動的パラメータの?は、||演算子の片方の側にのみ置くことができます。 すなわち"? || ?"は不可能です。||演算子の片側にある?パラメータの型は、その反対側にある||演算子のオペランドの式の型によって決まります。もし反対側の式の型がCHARあるいはVARCHARであれば、動的パラメータの型はその型の最大長のVARCHARです。 もし反対側の式の型がCHAR FOR BIT DATAあるいはVARCHAR FOR BIT DATAであれば、動的パラメータの型はその方の最大長のVARCHAR FOR BIT DATAです。 SELECT BITcolumn || ? FROM UserTable -- 型はBITcolumnと同じ最大長のCHAR FOR BIT DATAとなります。
  9. ? (dynamic parameter)used in conditional expression条件式では?で表される動的パラメータの利用が可能です。式の最初のオペランドに置かれた動的パラメータの型は真偽型とみなされます。 式の二つ目あるいは三つ目のうち、片方だけを動的パラメータとすることができます。動的パラメータの型は、もう片方の型と同じものとみなされます。(つまり対応するのは三つ目と二つ目のオペランドとなります。) SELECT c1 IS NULL ? ? : c1 -- この例では実行時に既定値を与えることができます。 -- その動的パラメータの型はc1と同じ型とみなされます。 -- :の両側に動的パラメータを置くことはできません。
  10. INSERT文のvaluesの一覧やselectの一覧に、動的パラメータを置くことができます。 動的パラメータの型は対象列の型と同じ型とみなされます。 INSERT INTO t VALUES (?) -- 動的パラメータの型は、 -- t表の唯一つの列と同じ型となります。 INSERT INTO t SELECT ? FROM t2 -- これは不可です。
  11. 副問合せと比較される?パラメータは、副問合せで選択された式の型をとります。 例を挙げます。 SELECT * FROM tab1 WHERE ? = (SELECT x FROM tab2) SELECT * FROM tab1 WHERE ? = ANY (SELECT x FROM tab2) -- 両方の場合において、動的パラメータの型は、 -- tab2.xと同じ型とみなされます。
  12. UPDATE文の値に対して動的パラメータを置くことができます。動的パラメータの型は、対照表の列の型と同じものとみなされます。 UPDATE t2 SET c2 =? -- c2と同じ型とみなされます。
  13. 単一オペランドをとる-や+の演算子にて、動的パラメータを利用可能です。 例を挙げます。CREATE TABLE t1 (c11 INT, c12 SMALLINT, c13 DOUBLE, c14 CHAR(3)) SELECT * FROM t1 WHERE c11 BETWEEN -? AND +? -– 両方の単一オペランドをとる演算子の型は、文脈に沿ってINTとなります。 -- (すなわち、c11がINTなので、単一オペランドをとる演算子もINTの型をとります。)
  14. LENGTHにて、動的パラメータを利用可能です。その型は最大長のVARCHARとみなされます。 SELECT LENGTH(?)
  15. 定量比較? = SOME (SELECT 1 FROM t) -- これは有効です。動的なパラメータの型はINTEGERとみなされます。 1 = SOME (SELECT ? FROM t) -- これは有効です。動的なパラメータの型はINTEGERとみなされます。
  16. IS式の左辺に動的パラメータを置くことができ、その型は真偽型とみなされます。

動的なパラメータの型が決まる式は一般的に、その動的パラメータを定数に置き換えて、どのような場所にも置くことができます。