4.33.1 1行SELECT文の形式と規則
(1) 機能
表のデータを検索します。
表から1行だけデータを取り出す場合は,カーソルを使用しないでデータを取り出す1行SELECT文を指定します。
1行SELECT文は,問合せ指定のSELECT句とオペランドは同じですが,問合せ指定でのSELECT句のように集合に対する操作をする文ではありません。
また,1行SELECT文は検索した結果を受け取る領域についての指定をするINTO句を含んでいます。
(2) 使用権限
問合せ指定の権限と同じです。
(3) 形式<1行以下のデータを,指定された埋込み変数に取り出し>
SELECT〔{ALL|DISTINCT}〕{選択式〔,選択式〕…|*} 〔INTO{:埋込み変数〔:標識変数〕 |〔文ラベル.〕SQL変数名 |〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名 |〔文ラベル.〕SQL変数名..属性名〔..属性名〕… |〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名 ..属性名〔..属性名〕…} 〔,{:埋込み変数〔:標識変数〕 |〔文ラベル.〕SQL変数名 |〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名 |〔文ラベル.〕SQL変数名..属性名〔..属性名〕… |〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名 ..属性名〔..属性名〕…}〕…〕 〈表式〉 FROM 表参照〔,表参照〕… 〔WHERE 探索条件〕 〔GROUP BY 値式〔,値式〕…〕 〔HAVING 探索条件〕 〈排他オプション〉 〔〔{WITH{SHARE|EXCLUSIVE}LOCK |WITHOUT LOCK〔{WAIT|NOWAIT}〕}〕〕 〔{WITH ROLLBACK|NO WAIT}〕 〔FOR UPDATE 〔OF 列名〔,列名〕…〕〔NOWAIT〕〕
(4) オペランド
SELECT句については「問合せ指定」を,表式については「表式」を,排他オプションについては「排他オプション」をそれぞれ参照してください。
(a) INTO句
INTO句は,SELECT文を単独でUAP,又は手続き中に直接記述する場合は,必ず指定してください。
ただし,次の箇所には指定できません。
-
PREPARE文で前処理するSQL中のSELECT文
-
EXECUTE IMMEDIATE文で前処理・実行するSQL中のSELECT文
-
カーソル宣言中のSELECT文
(b) :埋込み変数〔:標識変数〕
- 埋込み変数
-
一つの行の列の値を読み込む埋込み変数を指定します。
- 標識変数
-
埋込み変数に読み込まれる列の値がナル値の可能性がある場合に指定します。
(c) 〔文ラベル.〕SQL変数名
SQL手続き中で列の値を受け取るために,SQL変数を指定します。Java手続き中の指定値については,マニュアル「HiRDB UAP開発ガイド」のJDBCドライバ又はSQLJを参照してください。
(d) 〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名
SQL手続き中で列の値を受け取るために,SQLパラメタを指定します。Java手続き中の指定値については,マニュアル「HiRDB UAP開発ガイド」のJDBCドライバ又はSQLJを参照してください。
パブリック手続き定義のSQL手続き文中で認可識別子を指定する場合は,認可識別子にPUBLICを指定してください。
(e) 〔文ラベル.〕SQL変数名..属性名〔..属性名〕…
SQL手続き中で,列中の属性の値を受け取るために指定します。
(f) 〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名..属性名〔..属性名〕…
SQL手続き中で,列中の属性の値を受け取るために指定します。
パブリック手続き定義のSQL手続き文中で認可識別子を指定する場合は,認可識別子にPUBLICを指定してください。
(g) 〔FOR UPDATE 〔OF 列名〔,列名〕…〕〔NOWAIT〕〕
FOR UPDATE〔OF列名〔,列名〕…〕をFOR UPDATE句といいます。
- FOR UPDATE 〔OF 列名〔,列名〕…〕
-
1行SELECT文で取り出したデータを使用して,行の更新,削除,又は追加をする場合に指定します。1行SELECT文で取り出したデータを使用した行の更新,削除,又は追加もしない場合は,オペランドを省略してください。SQL中の排他オプションを省略した場合,排他オプションはpd_isolation_levelの指定値,PDISLLVLの指定値,又はSQLコンパイルオプションで指定するデータ保証レベルの指定値によって決まりますが,PDFORUPDATEEXLOCKにYES,又はSQLコンパイルオプションのデータ保証レベルの後にFOR UPDATE EXCLUSIVEを指定することで,この指定のあるカーソルに対する排他オプションはWITH EXCLUSIVE LOCKが仮定されます。詳細については,マニュアル「HiRDB UAP開発ガイド」を参照してください。
- 〔OF 列名〔,列名〕…〕
-
一般的には指定する必要がありません。
1行SELECT文の選択式で指定していない列でも指定できます。ただし,同じ列を2回以上指定できません。また,予備列は指定できません。
指定する列名は,AS列名に指定した列名ではなく,最も外側の問合せ指定のFROM句に指定した表の列を指定します。
- 〔NOWAIT〕
-
FOR UPDATE句を指定し,かつ排他オプションにWITH EXCLUSIVE LOCK NO WAITを指定した場合と同じ動作をします。ただし,排他オプションを指定した場合,NOWAITは指定できません。
排他オプションにWITH EXCLUSIVE LOCK NO WAITを指定した場合の動作については,「排他オプション」を参照してください。
(5) 共通規則
-
検索結果が1行以下の場合は,カーソルを使用しないでINTO句を指定して検索できます。ただし,検索結果が2行以上の場合,検索できません。
-
検索結果の列の個数と,INTO句で指定した埋込み変数の個数は同じにしてください。列の個数と,埋込み変数の個数が同じでない場合は,SQL連絡領域のSQLWARN3領域に警告フラグ”W”が設定されます。
-
INTO句で指定する埋込み変数のデータ型は,対応する列のデータ型,又は変換できるデータ型にしてください。
-
埋込み変数が既定文字集合の文字データ型で,かつ検索結果がその埋込み変数と異なる文字集合の文字データ型の場合,自動的に埋込み変数の文字集合に変換します。
-
固定長文字列(各国文字列,及び混在文字列を含む)の埋込み変数に取り出すデータが,検索項目の長さより短い場合は,左詰めに挿入され,余りの部分に空白が設定されます。
-
検索結果の列の値がナル値の場合,対応する埋込み変数の値は保証しません。
-
検索結果の列の値がナル値の場合は,対応する標識変数を指定してください。
-
-
取り出す行がない場合,次のリターンコードが設定されます。
-
SQL連絡領域のSQLCODE領域に100
-
SQLCODE変数に100
-
SQLSTATE変数に’02000’
-
-
「カーソル指定 形式1」,及び「問合せ指定」の規則に従って,UNION〔ALL〕,EXCEPT〔ALL〕,ORDER BY句,及びLIMIT句を指定できます。
UNION〔ALL〕,及びEXCEPT〔ALL〕を指定した場合のINTO句は,最初のSELECT句の次に一度だけ指定してください。
-
1行SELECT文又は排他オプション中に次のどれかの指定を含む場合は,FOR UPDATE句の指定はできません。
(5-a) UNION〔ALL〕,又はEXCEPT〔ALL〕
(5-b) 最も外側の問合せ指定のFROM句に指定した表を,副問合せのFROM句に指定
(5-c) 最も外側の問合せ指定での表の結合
(5-d) 最も外側の問合せ指定でのFROM句の導出表
(5-e) 最も外側の問合せ指定でのSELECT DISTINCT
(5-f) 最も外側の問合せ指定でのGROUP BY句
(5-g) 最も外側の問合せ指定でのHAVING句
(5-h) 最も外側の問合せ指定に対する集合関数
(5-i) 最も外側の問合せ指定でのウィンドウ関数
(5-j) 最も外側の問合せ指定のFROM句中で,次に示すどれかのビュー表を指定
-
ビュー定義文で上記(5-a)〜(5-i)を指定して定義したビュー表
-
ビュー定義文で最も外側の問合せ指定のSELECT句に,列指定以外の値式を指定して定義したビュー表
-
ビュー定義文中で,READ ONLYを指定して定義したビュー表
(5-k) WITHOUT LOCK NOWAIT
-
(6) 使用例
使用例については,「DECLARE CURSOR 形式1(カーソル宣言)」を参照してください。