2.9.1 値式,値指定,及び項目指定の形式と規則
(1) 機能
SQL中に値を指定する場合,次の形式で値を指定できます。
(2) 形式
値式::={〔+|−〕一次子|値式{+|−|*|/}〔{+|−}〕一次子 |値式 * 一次子|値式 / 一次子|値式 ‖ 一次子} 一次子::={(値式)|項目指定|符号なし値指定|集合関数|ウィンドウ関数|スカラ関数 |CASE式|CAST指定|ラベル付き間隔|関数呼出し |スカラ副問合せ|NEXT VALUE式} 値指定::={定数|?パラメタ|:埋込み変数〔:標識変数〕 |USER|CURRENT_USER|CURRENT_DATE|CURRENT_TIME |CURRENT_TIMESTAMP〔(p)〕 |CURRENT DATE|CURRENT TIME |CURRENT TIMESTAMP〔(p)〕 |〔文ラベル.〕SQL変数名 |〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名 |SQLCODE|SQLCOUNT|SQLCODE_OF_LAST_CONDITION|SQLERRM_OF_LAST_CONDITION} 符号なし値指定::= {符号なし数定数|一般定数|?パラメタ|:埋込み変数〔:標識変数〕 |USER|CURRENT_USER|CURRENT_DATE|CURRENT_TIME |CURRENT_TIMESTAMP〔(p)〕 |CURRENT DATE|CURRENT TIME |CURRENT TIMESTAMP〔(p)〕 |〔文ラベル.〕SQL変数名 |〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名 |SQLCODE|SQLCOUNT|SQLCODE_OF_LAST_CONDITION|SQLERRM_OF_LAST_CONDITION} 定数::={数定数|一般定数} 一般定数::={文字列定数|16進文字列定数 |各国文字列定数|混在文字列定数} 項目指定::={列指定 |〔文ラベル.〕SQL変数名 |〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名 |コンポネント指定}
(3) 共通規則
-
値式中で指定できる演算のうち,四則演算,日付演算,時刻演算,連結演算,CASE式,CAST指定,ウィンドウ関数,スカラ関数,及びNEXT VALUE式を総称して,スカラ演算といいます。
-
値式は,比較述語,比較値,BETWEEN述語,IN述語,LIKE述語,XLIKE述語,限定述語,論理述語,コンポネント指定,関数呼出し,列指定,更新値,一次子,集合関数,又はスカラ演算で指定します。
-
スカラ演算の評価順序を次に示します。
1. 括弧内
2. *又は/
3. +,−,又は‖
ただし,評価順序の同じスカラ演算が値式中に複数ある場合は,左から右に評価されます。
-
スカラ演算のネストの最大数は,255です。スカラ演算のネストの数は,演算子+,−,*,/,又は‖の評価順序を表す括弧を省略しないで指定した場合の括弧のネスト数です。なお,ネスト数はスカラ関数の種類によって次のようになります。
-
スカラ関数SUBSTR,VARCHAR_FORMAT,TIMESTAMP_FORMAT,DATE(日時書式を指定したとき),TIME(日時書式を指定したとき),及びTIMESTAMP(機能3.のとき)を指定した場合は2となります。
-
スカラ関数VALUEは引数の値式の数+1となります。
-
そのほかのスカラ関数は1となります。
また,単純CASE式,及び探索CASE式はWHENの数,CASE略式のCOALESCEは引数の値式の数+1,CASE略式のNULLIFは2としてそれぞれ数えます。
名前付き導出表の列をオペランドとするスカラ演算を指定して,その列がスカラ演算で導出され,かつその名前付き導出表が内部導出表を作成しない場合,名前付き導出表の列を導出する,スカラ演算をオペランドとするスカラ演算を指定することと等価となり,スカラ演算の最大ネスト数を超えることがあります。
値式中にスカラ演算と関数呼出しを指定する場合,スカラ演算のネスト数と関数呼出しのネスト数の合計は,最大255です。
-
-
指定したデータがナル値の場合は,四則演算,日付演算,時刻演算,又は連結演算の結果もナル値になります。
-
四則演算,日付演算,又は時刻演算の除算で,第2演算項の値に0を指定した場合,エラーになります。
-
演算途中でオーバフローが発生した場合は,エラーになります。値式については,「四則演算」,「日付演算」,「時刻演算」,及び「連結演算」を参照してください。
-
SQLパラメタ名は,手続き定義の中でそのSQL手続きのSQLパラメタを参照するために使用できます。
-
SQL変数名は,手続き定義又は関数定義の中の複合文中で,その複合文中で宣言したSQL変数を参照するために使用できます。
-
同じ名前の列,SQL変数,又はSQLパラメタがあるとき,それらの名前は表指定,文ラベル,又は〔認可識別子.〕ルーチン識別子で修飾して指定します。修飾しないか,又は修飾子が同じ場合には,それらの名前の有効範囲の狭い順に優先されて識別されます。すなわち,列,SQL変数,SQLパラメタの順に優先されます。列名として有効であるときは,列として識別されます。列としては無効で,SQL変数として有効であるときは,SQL変数として識別されます。列,及びSQL変数としては無効で,SQLパラメタとして有効であるときは,SQLパラメタとして識別されます。列,SQL変数,及びSQLパラメタとして無効であるときは,文法上エラーとなります。
ただし,ハンドラ宣言中は,そのハンドラ宣言の外側の文ラベル,又は〔認可識別子.〕ルーチン識別子を継承しません。したがって,ハンドラ宣言中でSQL変数又はSQLパラメタを,文ラベル又は〔認可識別子.〕ルーチン識別子で修飾した場合,該当するハンドラ宣言中に宣言した文ラベルだけ有効となります。列,SQL変数,及びSQLパラメタの有効範囲の例を次に示します。INTEGER型の列Y及びZがある表T1を定義しているものとします。
- 〔説明〕
-
1.範囲Cで定義されたSQL変数「X」に10が代入されます。
2.範囲Bで定義されたSQL変数「Z」に10が代入されます。
3.範囲Cで定義されたSQL変数「X」に10が代入されます。
4.エラー(該当するハンドラ宣言中に有効な「Z」がない)となります。
5.エラー(ハンドラ宣言中のため,「PPP」は継承しない)となります。
6.SQLパラメタ「Y」に10が代入されます。
7.エラー(ハンドラ宣言中のため,「AAA」は継承しない)となります。
8.エラー(ハンドラ宣言中のため,「PPP」は継承しない)となります。
9.範囲Bで定義されたSQL変数「X」に,表T1の列「Y」の値が代入されます。また,1行SELECT文中のWHERE句中に指定している「Y」,及び「Z」は,表T1の列「Y」,及び「Z」が使用されます。
10.範囲Eで定義されたSQL変数「X」に10が代入されます。
11.範囲Eで定義されたSQL変数「Y」に10が代入されます。
12.範囲Eで定義されたSQL変数「X」に10が代入されます。
13.範囲Eで定義されたSQL変数「Y」に10が代入されます。
14.SQLパラメタ「Y」に10が代入されます。
-
SQL手続き文中を除く,ルーチン制御SQL中だけで使用できる値指定は次のとおりです。括弧内は,それぞれのデータ型を示します。
SQLCODE及びSQLCOUNTは,ルーチン制御SQLを除く直前のSQL手続き文を実行した結果のリターンコードが100であることの判定や,更新行数の参照に使用します。
SQLCODE_OF_LAST_CONDITION又はSQLERRM_OF_LAST_CONDITIONは,ルーチン制御SQLを除くSQL手続き文を実行した結果のリターンコードが0以外になった最後のリターンコード及びメッセージを,例外ハンドラ中で参照する場合に使用します。
-
添字のない繰返し列は,CASE式の探索条件に直接指定した,繰返し列を除くスカラ演算に指定できません。
-
添字ANYは,CASE式の探索条件に指定した,繰返し列を除くスカラ演算に指定できません。
-
スカラ副問合せについては,「副問合せ」を参照してください。