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

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

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式の左辺に動的パラメータを置くことができ、その型は真偽型とみなされます。

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

親トピック: 動的パラメータ
関連資料
動的パラメータの例