型なし式のデータ・タイプの判別

型なし式は、ターゲット・データ・タイプが関連付けられずに指定されたパラメーター・マーカーまたは NULL 値、あるいは DEFAULT キーワードが使用されていることを意味します。

次の条件のいずれかを満たしている限り、型なし式を SQL ステートメントで使用することができます。
  • SQL ステートメントをコンパイルするために CLI アプリケーションまたは JDBC アプリケーションによって PREPARE ステートメントが実行されている場合、クライアント・インターフェースが据え置き準備を使用している場合、または、レジストリー変数 DB2_DEFERRED_PREPARE_SEMANTICS が YES に設定されている場合。 この場合、型なしパラメーター・マーカーは、後続の OPEN または EXECUTE ステートメントに関連付けられている入力記述子に基づき、そのデータ・タイプを求めます。 長さ属性は、 関数表 2 で説明されているように、UNTYPED 行に従って長さの最大値に設定されます。長さは以下の表で決定されます。 関数表 2 にターゲット・タイプとしてリストされていないデータ・タイプの場合、後続の OPEN または EXECUTE ステートメントに関連付けられた入力記述子からの長さが使用されます。 SQL ステートメントの型なしパラメーター・マーカーの使用法によっては、データ・タイプと長さが変更されることがあります。
  • データ・タイプは、SQL ステートメントのコンテキストに基づいて判別できます。 それらの位置と結果データ・タイプを以下の表に示しています。 位置は、式、述部、組み込み関数、およびユーザー定義ルーチンに類別されており、 型なし式の適用度を容易に判別することができます。 コンテキストに基づいてデータ・タイプを判別できない場合は、エラーが発行されます。

表に当てはまらない場合、選択リスト内の型なし式は、SQL ステートメントでの使用法に基づいて判別されるデータ・タイプに解決されることもあります。

型なし式のコード・ページは、コンテキストによって決定されます。 コンテキストがない場合、コード・ページは、型なし式が VARCHAR データ・タイプにキャストされる場合と同じです。

以下の表には、ストリング単位のデフォルトが SYSTEM である場合にデータベース環境に関連付けられているストリング単位の文字ストリング・データ・タイプとグラフィック・ストリング・データ・タイプが示されています。 Unicode データベース環境のストリング単位が CODEUNITS32 に設定されている場合は、データ・タイプの最大長を表す文字ストリングまたはグラフィック・ストリングの長さ属性を、CODEUNITS32 のデータ・タイプの最大値を表すものと見なす必要があります。 すべての文字ストリング・データ・タイプまたはグラフィック・ストリング・データ・タイプで、データベース環境のデフォルトのストリング単位を使用します。

表 1. 式 (選択リスト、CASE、VALUES を含む) での型なしの使用法
型なしの位置 データ・タイプ
選択リストに単独で 型なし式に名前がない場合、または名前があっても、その後で SQL ステートメントで参照されていない場合は、型なし式が NULL 値である場合を除き、エラーが戻されます。 そのような場合、データ・タイプは VARCHAR(1) です。

型なし式に名前が付けられ、その後で SQL ステートメント内で参照されている場合、データ・タイプは後続の使用法から判別することができます。 詳しくは、この表に続く『使用法からのデータ・タイプの判別』を参照してください。

演算子優先順位と演算順序規則の分析後に、単一算術演算子のオペランドの両方となる位置
例:
   (? + ?) + 10
DECFLOAT(34)
日付/時刻の式以外の算術式の単一演算子のオペランドのいずれか一方
例:
   ? + (? * 10)
もう一方のオペランドのデータ・タイプ
日時式内のラベル付き期間 (ラベル付き期間の単位のタイプを示す部分には、パラメーター・マーカーを使用できません) DECIMAL(15,0)
日付/時刻の式のその他のオペランド ('timecol + ?' または '? - datecol' )など エラー
CONCAT 演算子の 2 つのオペランド VARCHAR(254)
CONCAT 演算子の一方のオペランド (もう一方のオペランドが CLOB 以外の 文字データ・タイプである場合) 一方のオペランドが CHAR(n) または VARCHAR(n) (n は 128 より小さい) の場合、もう一方のオペランドは VARCHAR(254 - n)であり、他のすべての場合のデータ・タイプは VARCHAR(254)
CONCAT 演算子の一方のオペランド (もう一方のオペランドが BLOB 以外のバイナリー・データ・タイプである場合) 一方のオペランドが BINARY(n) または VARBINARY(n) (n は 128 より小さい) の場合、もう一方のオペランドは VARBINARY(254 - n)であり、他のすべての場合のデータ・タイプは VARBINARY(254)
CONCAT 演算子の一方のオペランド (もう一方のオペランドが DBCLOB 以外の GRAPHIC データ・タイプである場合) 一方のオペランドが GRAPHIC(n) または VARGRAPHIC(n) (n は 64 より小さい) の場合、もう一方のオペランドは VARGRAPHIC(127 - n) であり、他のすべての場合のデータ・タイプは VARGRAPHIC(127)
CONCAT 演算子の一方のオペランド (もう一方のオペランドがラージ・オブジェクト・ストリングである場合) もう一方のオペランドと同じ
単純な CASE 式の CASE キーワードに続く式 WHEN キーワードの後の型なし式以外の式に結果データ・タイプの規則を適用した結果
CASE 式 (単純および検索) の結果式の少なくとも 1 つ。結果式の残りが型なし式 エラー
単純な CASE 式の the WHEN キーワード の後に続く任意の式またはすべての式 CASE に続く式、および WHEN キーワードに続く、型なし式以外の式に結果データ・タイプの規則を適用した結果
型なし式ではない結果式が少なくとも 1 つある CASE 式 (単純および検索) の結果式 型なし式 以外のすべての結果式に結果データ・タイプの規則 を適用した結果。
INSERT ステートメント内になく、MERGE ステートメントの挿入操作の VALUES 節内にもない、単一行 VALUES 節の列式として単独で 型なし式に名前がない場合、または名前が付けられているけれども、その後で SQL ステートメントで参照されていない場合は、エラーが戻されます。 型なし式に名前が付けられ、その後で SQL ステートメント内で参照されている場合、データ・タイプは後続の使用法から判別することができます。 詳しくは、この表に続く『使用法からのデータ・タイプの判別』を参照してください。
INSERT ステートメント内になく、 他のすべての行式での同じ位置にある列式が型なし式である複数行 VALUES 節の列式として単独で 型なし式に名前がない場合、または名前が付けられているけれども、その後で SQL ステートメントで参照されていない場合は、エラーが戻されます。 型なし式に名前が付けられ、その後で SQL ステートメント内で参照されている場合、データ・タイプは後続の使用法から判別することができます。 詳しくは、この表に続く『使用法からのデータ・タイプの判別』を参照してください。
INSERT ステートメント内になく、他の行式のうちの少なくとも 1 つで同じ位置にある式が型なしではない、複数行 VALUES 節の列式として単独で 型なし以外のすべてのオペランドに結果データ・タイプの規則を適用した結果
INSERT ステートメント内にある単一行 VALUES 節の列式として単独で 列のデータ・タイプ。 その列がユーザー定義特殊タイプとして定義されている場合は、 そのユーザー定義特殊タイプのソース・データ・タイプ。 その列がユーザー定義の構造化タイプとして定義されている場合は、構造化タイプ。 これはトランスフォーム関数の戻りタイプも示している。
INSERT ステートメント内にある複数行 VALUES 節の列式として単独で 列のデータ・タイプ。 その列がユーザー定義特殊タイプとして定義されている場合は、 そのユーザー定義特殊タイプのソース・データ・タイプ。 その列がユーザー定義の構造化タイプとして定義されている場合は、構造化タイプ。 これはトランスフォーム関数の戻りタイプも示している。
MERGE ステートメントのソース表の VALUES 節の列式として単独で 型なし式に名前がない場合、または名前が付けられているけれども、その後で SQL ステートメントで参照されていない場合は、エラーが戻されます。 型なし式に名前が付けられ、その後で SQL ステートメント内で参照されている場合、データ・タイプは後続の使用法から判別することができます。 詳しくは、この表に続く『使用法からのデータ・タイプの判別』を参照してください。
MERGE ステートメントの挿入操作の VALUES 節の列式として単独で 列のデータ・タイプ。 その列がユーザー定義特殊タイプとして定義されている場合は、 そのユーザー定義特殊タイプのソース・データ・タイプ。 その列がユーザー定義の構造化タイプとして定義されている場合は、構造化タイプ。 これはトランスフォーム関数の戻りタイプも示している。
MERGE ステートメントの更新操作の代入節の右側の列式として単独で 列のデータ・タイプ。 その列がユーザー定義特殊タイプとして定義されている場合は、 そのユーザー定義特殊タイプのソース・データ・タイプ。 その列がユーザー定義の構造化タイプとして定義されている場合は、構造化タイプ。 これはトランスフォーム関数の戻りタイプも示している。
UPDATE ステートメントの SET 節の右側の列式として単独で 列のデータ・タイプ。 その列がユーザー定義特殊タイプとして定義されている場合は、 そのユーザー定義特殊タイプのソース・データ・タイプ。 その列がユーザー定義の構造化タイプとして定義されている場合は、構造化タイプ。 これはトランスフォーム関数の戻りタイプも示している。
SET 特殊レジスター・ステートメントの右側にある値として 特殊レジスターのデータ・タイプ
表参照の tablesample-clause の TABLESAMPLE 節の引数 DOUBLE
table-reference の tablesample-clause の REPEATABLE 副節の引数 INTEGER
fetch-clause の fetch-row-count として単独で BIGINT
OFFSET 節の offset-row-count として単独で BIGINT
FREE LOCATOR ステートメントの値として ロケーター
SET ENCRYPTION PASSWORD ステートメントのパスワードの値として VARCHAR(128)
注:
使用法からのデータ・タイプの判別
次に、型なし式のデータ・タイプを後続の使用法から判別する方法の例を示します。

名前付きの型なし式が、その後、比較演算子内で参照される場合、その型なし式は、もう一方のオペランドのデータ・タイプになります。 名前付きの型なし式の参照が SQL ステートメント内に複数存在する場合、これらの各参照で個別に判別されるデータ・タイプ、長さ、精度、位取り、およびコード・ページは、同じである必要があります。異なる場合は、エラーが戻されます。

表 2. 述部での型なしの使用法
型なしの位置 データ・タイプ
比較演算子の両方のオペランド VARCHAR(254)
比較演算子の一方のオペランド (もう一方のオペランドは型なし以外の場合) もう一方のオペランドのデータ・タイプ
BETWEEN 述部のすべてのオペランド VARCHAR(254)
BETWEEEN 述部の 2 つのオペランド 型なし式が 1 つのみの場合と同じ
BETWEEN 述部の一方のオペランドのみ 型なし以外のすべてのオペランドに結果データ・タイプの規則を適用した結果
IN 述部のすべてのオペランド。例えば、? IN (?,?,?) VARCHAR(254)
IN 述部の第 1 オペランド (右側が全選択の場合: IN (全選択) など) 選択した列のデータ・タイプ。
IN 述部の第 1 オペランド (右側が副選択でない場合: ? IN (?,A,B) や ? IN (A,?,B,?) など) IN リストのオペランド (IN キーワードの右側のオペランド) のうち、型なし式以外のすべてのオペランドに『結果データ・タイプの規則』を適用した結果
IN 述部の IN リストのいずれかまたはすべてのオペランド (A IN (?,B, ?) など) IN 述部のオペランド (IN キーワードの左右のオペランド) のうち、型なし式以外のすべてのオペランドに『結果データ・タイプの規則』を適用した結果
IN 述部の行値式のオペランドと、それに対応する全選択の結果列の両方 ((c1,?) IN (SELECT c1, ? 送信元 ...) VARCHAR(254)
IN 述部の row-value-expression 内のオペランド ((c1,?) IN 全選択など) 例 1: 全選択の対応する結果列のデータ・タイプ
IN 述部で row-value-expression が指定されている場合、副照会内の選択リスト項目 ((c1,c2) IN (SELECT?, c1, FROM ...) など) 例 1: row-value-expression 内の対応するオペランドのデータ・タイプ
LIKE 述部の 3 つのオペランドすべて 一致式 (オペランド 1) とパターン式 (オペランド 2) は VARCHAR(32672) であり、エスケープ式 (オペランド 3) は VARCHAR(2)
LIKE 述部の一致式 (パターン式またはエスケープ式のいずれかが、 型なし以外である場合) 第 1 オペランドのデータ・タイプ (型なし以外) に応じて、VARCHAR(32672)、VARBINARY(32672)、または VARGRAPHIC(16336) のいずれか。
LIKE 述部のパターン式 (一致式またはエスケープ式のいずれかが、 型なし以外である場合) 第 1 オペランドのデータ・タイプ (型なし以外) に応じて、VARCHAR(32672)、VARBINARY(32672)、または VARGRAPHIC(16336) のいずれか。
LIKE 述部のエスケープ式 (一致式またはパターン式のいずれかが、 型なし以外である場合) 第 1 オペランドのデータ・タイプ (型なし以外) に応じて、VARCHAR(2)、VARBINARY(1)、または VARGRAPHIC(1) のいずれか。
NULL 述部のオペランド VARCHAR(254)
表 3. 組み込み関数での型なしの使用法
型なしパラメーター・マーカーの位置 データ・タイプ
ARRAY の配列指標 BIGINT
すべての引数が型なしパラメーター・マーカーである場合、COALESCE のすべての引数 エラー
COALESCE の任意の引数 (少なくとも 1 つの引数が非型付きパラメーター・マーカーでない場合) 型なしパラメーター・マーカー以外のすべての引数に結果データ・タイプの規則を適用した結果
DAYNAME の第 1 引数 TIMESTAMP(12)
DIGITS の引数 10 進数 (31, 6)
FROM_UTC_TIMESTAMP の第 1 引数 TIMESTAMP(6)
すべての引数がタイプなしパラメーター・マーカーである場合、MAX、MIN、または NULLIF のすべての引数 エラー
MAX、MIN、または NULLIF のいずれかの引数 (少なくとも 1 つの引数が非型付きパラメーター・マーカーでない場合) 型なしパラメーター・マーカー以外のすべての引数に結果データ・タイプの規則を適用した結果
MONTHNAME の第 1 引数 TIMESTAMP(12)
POSSTR (両方の引数) 両方の引数は VARCHAR(32672)
POSSTR の一方の引数 (もう一方の引数が文字データ・タイプである場合) VARCHAR(32672)
POSSTR の一方の引数 (もう一方の引数が GRAPHIC データ・タイプである場合) VARGRAPHIC(16336)
POSSTR の search-string 引数 (もう一方の引数がバイナリー・データ・タイプである場合) VARBINARY(32672)
REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、REGEXP_COUNT の最初の引数と 2 番目の引数 VARCHAR(32672)
REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、または REGEXP_COUNT の最初の引数 (2 番目の引数が型なし式でない場合) 2 番目の引数がグラフィック・データ・タイプの場合は VARGRAPHIC(16336)。それ以外の場合は VARCHAR(32672)
REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、または REGEXP_COUNT の 2 番目の引数 (最初の引数が型なし式でない場合) 最初の引数が Unicode データベースのグラフィック・データ・タイプの場合は VARGRAPHIC(16336)。それ以外の場合は VARCHAR(32672)
REGEXP_REPLACE の最初の 3 つの引数 VARCHAR(32672)
REGEXP_REPLACE の最初の引数 (2 番目または 3 番目の引数が型なし式でない場合) 3 番目の引数がグラフィック・データ・タイプであるか、3 番目の引数が型なし式で 2 番目の引数がグラフィック・データ・タイプである場合は VARGRAPHIC(16336)。それ以外の場合は VARCHAR(32672)
REGEXP_REPLACE の 2 番目の引数 (最初の引数または 3 番目の引数が型なし式でない場合) 最初の引数が Unicode データベースのグラフィック・データ・タイプの場合は VARGRAPHIC(16336)。それ以外の場合は VARCHAR(32672)
REGEXP_REPLACE の 3 番目の引数 (最初の引数または 2 番目の引数が型なし式でない場合) 最初の引数がグラフィック・データ・タイプであるか、最初の引数が型なし式で 2 番目の引数がグラフィック・データ・タイプである場合は VARGRAPHIC(16336)。それ以外の場合は VARCHAR(32672)
SUBSTR の第 1 引数 VARCHAR(32672)
SUBSTR の第 2 および第 3 引数 INTEGER
SUBSTRB の第 1 引数 VARCHAR(32672)
SUBSTR2 の第 1 引数 データベースがグラフィック・タイプをサポートしている場合は VARGRAPHIC(16336)、サポートしていない場合は VARCHAR(32672)
SUBSTR4 の第 1 引数 VARCHAR(32672)
TIMESTAMP の第 2 引数 時刻
TIMESTAMP_FORMAT の第 1 引数 VARCHAR(254)
TIMEZONE の第 1 引数 TIMESTAMP(6)
TO_UTC_TIMESTAMP の第 1 引数 TIMESTAMP(6)
TRANSLATE の第 2 および第 3 引数 第 1 引数が文字タイプの場合は VARCHAR(32672)、第 1 引数が GRAPHIC タイプの場合は VARGRAPHIC(16336)
TRANSLATE の第 4 引数 第 1 引数が文字タイプの場合は VARCHAR(1)、第 1 引数が GRAPHIC タイプの場合は VARGRAPHIC(1)
TRIM_ARRAY の第 2 引数 BIGINT
単項マイナス DECFLOAT(34)
単項プラス DECFLOAT(34)
すべての引数が型なしパラメーター・マーカーである場合、VALUE のすべての引数 エラー
少なくとも 1 つの引数が型なしパラメーター・マーカーでない場合、VALUE の任意の引数 型なしパラメーター・マーカー以外のすべての引数に結果データ・タイプの規則を適用した結果
VARCHAR_FORMAT の第 1 引数 TIMESTAMP(12)
XMLCOMMENT の第 1 引数 VARCHAR(32672)
XMLCONCAT のすべての引数 XML
XMLDOCUMENT の第 1 引数 XML
XMLELEMENT または XMLEXISTS の引数 エラー
XMLPI の第 2 引数 VARCHAR(32672)
XMLQUERY の引数 エラー
XMLSERIALIZE の第 1 引数 XML
XMLTABLE の引数 エラー
XMLTEXT の第 1 引数 VARCHAR(32672)
XMLVALIDATE の第 1 引数 XML
XMLXSROBJECTID の第 1 引数 XML
集約関数の引数 エラー
その他のすべてのスカラー関数のその他のすべての引数 関数解決によって決定される関数定義のパラメーターのデータ・タイプ。 引数の長さは、「関数解決」セクションの 表 2 に基づいて導出されます。
表 4. ユーザー定義ルーチンでの型なしの使用法
型なしパラメーター・マーカーの位置 データ・タイプ
関数の引数 関数の作成時に定義された、パラメーターのデータ・タイプおよび長さ。
メソッドの引数 エラー
プロシージャーの引数 プロシージャーの作成時に定義された、パラメーターのデータ・タイプ