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

データ型が簡単に決定される場所であれば、式の何処にでも動的パラメータを置くことができます。
  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の型を利用する事が可能です。詳細はConcatenationを参照してください。)
    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. 条件式では?で表される動的パラメータの利用が可能です。式の最初のオペランドに置かれた動的パラメータの型は真偽型とみなされます。 式の二つ目あるいは三つ目のうち、片方だけを動的パラメータとすることができます。動的パラメータの型は、もう片方の型と同じものとみなされます。(つまり対応するのは三つ目と二つ目のオペランドとなります。)
    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式の左辺に動的パラメータを置くことができ、その型は真偽型とみなされます。

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

関連資料
動的パラメータの例