Hitachi

ノンストップデータベース HiRDB Version 10 SQLリファレンス


4.34.1 動的SELECT文 形式1の形式と規則

〈この項の構成〉

(1) 機能

次に示す検索ができます。

(2) 使用権限

カーソル指定 形式1」を参照してください。

(3) 形式

 〈カーソル指定 形式1〉
  〈問合せ式〉
   〈問合せ指定〉
    {SELECT〔{ALL|DISTINCT}〕{選択式〔,選択式〕…|*}
    〈表式〉
    FROM 表参照〔,表参照〕…
        〔WHERE 探索条件〕
        〔GROUP BY 値式〔,値式〕…〕
        〔HAVING 探索条件〕
     | 問合せ式 }
    〔ORDER BY {列指定|ソート項目指定番号}〔{ASC|DESC}〕
       〔,{列指定|ソート項目指定番号}〔{ASC|DESC}〕〕… 〕
    〔LIMIT {〔オフセット行数,〕{リミット行数|ALL}
        | {リミット行数|ALL} 〔OFFSET オフセット行数〕}〕
 〈排他オプション〉
  〔〔{WITH{SHARE|EXCLUSIVE}LOCK 
     |WITHOUT LOCK〔{WAIT|NOWAIT}〕}〕
  〔{WITH ROLLBACK|NO WAIT}〕〕
     〔FOR {UPDATE 〔OF列名〔,列名〕…〕〔NOWAIT〕|READ ONLY}〕
     〔UNTIL DISCONNECT〕

(4) オペランド

次の項目については,それぞれの箇所を参照してください。

(a) FOR {UPDATE〔OF列名〔,列名〕…〕〔NOWAIT〕|READ ONLY}

FOR UPDATE 〔OF列名〔,列名〕…〕をFOR UPDATE句といいます。

FOR UPDATE

カーソルを使用して検索中の表に対して,そのカーソルを使用した行の更新,又は削除をして,更にほかのカーソル,又は直接探索条件を指定して行を更新,追加,又は削除する場合に指定します。

FOR UPDATEを省略した場合,そのカーソルを使用して検索中の表に対して行の更新,追加,又は削除はできません。

カーソル指定,又は排他オプション中に次のどれかの指定を含む場合は,FOR UPDATE句の指定はできません。

(4-a) UNION〔ALL〕,又はEXCEPT〔ALL〕

(4-b) 最も外側の問合せ指定のFROM句に指定した表を,副問合せのFROM句に指定

(4-c) 最も外側の問合せ指定での表の結合

(4-d) 最も外側の問合せ指定でのFROM句の導出表

(4-e) 最も外側の問合せ指定でのSELECT DISTINCT

(4-f) 最も外側の問合せ指定でのGROUP BY句

(4-g) 最も外側の問合せ指定でのHAVING句

(4-h) 最も外側の問合せ指定に対する集合関数

(4-i) 最も外側の問合せ指定に対するウィンドウ関数

(4-j) 最も外側の問合せ指定のFROM句中で,次に示すどれかのビュー表を指定

  • ビュー定義文で上記(4-a)〜(4-i)を指定して定義したビュー表

  • ビュー定義文で最も外側の問合せ指定のSELECT句に,列指定以外の値式を指定して定義したビュー表

  • ビュー定義文中で,READ ONLYを指定して定義したビュー表

(4-k) WITHOUT LOCK NOWAIT

(4-l) WITH句を指定した問合せ式本体の最も外側の問合せ指定のFROM句に問合せ名を指定

OF列名〔,列名〕…

カーソルを使用して検索中の表に対して,そのカーソルを使用した検索行の更新だけをする場合に,更新する列を指定します。

SELECT文の選択式で指定していない列でも指定できます。ただし,同じ列を2回以上指定できません。また,予備列は指定できません。

カーソルを使用して検索中の表に対して,そのカーソル及びほかのカーソルを使用した行の更新,削除がなく,カーソルを使用しない行の更新,削除,及び追加もしない場合には,オペランドを省略してください。

指定する列名は,AS列名に指定した列名ではなく,最も外側の問合せ指定のFROM句に指定した表の列を指定します。

〔NOWAIT〕

排他オプションにWITH EXCLUSIVE LOCK NO WAITを指定した場合と同じ動作をします。ただし,排他オプションを指定した場合,FOR UPDATE句にNOWAITは指定できません。

排他オプションにWITH EXCLUSIVE LOCK NO WAITを指定した場合の動作については,「排他オプション」を参照してください。

FOR READ ONLY

カーソルを使用して検索中に,ほかのカーソル,又は直接探索条件を指定して更新する場合に指定します。検索中の更新が検索結果に影響を与えないようにする場合にFOR READ ONLYを指定します。

FOR READ ONLY句を指定した場合,次の制限があります。

(4-a) 選択式中に,結果が次のデータ型になるスカラ演算,関数呼出し,及びコンポネント指定は指定できません。

  • BLOB

  • 最大長が32,001バイト以上のBINARY

  • BOOLEAN

  • 抽象データ型

(4-b) 選択式中のWRITE指定の出力BLOB値には,列指定だけ指定できます。

(4-c) GET_JAVA_STORED_ROUTINE_SOURCE指定は指定できません。

(b) 〔UNTIL DISCONNECT〕

ホールダブルカーソルを使用する場合に指定します。ホールダブルカーソルについては,マニュアル「HiRDB UAP開発ガイド」を参照してください。

ホールダブルカーソルについての規則を次に示します。

  1. 次の場合,ホールダブルカーソルは使用できません。

    • ホールダブルカーソルに未対応のプラグインを使用した抽象データ型の列を指定した場合

    • ホールダブルカーソルに未対応のプラグインを使用した関数呼出しを指定した場合

    • ホールダブルカーソルに未対応のプラグインを使用した関数呼出しを指定して導出した,名前付きの導出表に対する問合せを指定した場合

    • ON COMMIT DELETE ROWSを指定して定義した一時表に対する問合せ

  2. ホールダブルカーソルが開いている場合,定義系SQLは実行できません。また,ホールダブルカーソルが閉じている場合,定義系SQLを実行するとホールダブルカーソルを使用している前処理は無効になります。

  3. ホールダブルカーソルを使用したSELECT文に対してOPEN文を実行後,そのSELECT文中で使用している表に対してPURGE TABLE文を実行すると,カーソルは閉じた状態になります。

  4. ホールダブルカーソルを使用したSELECT文に対してOPEN文を実行してからDISCONNECTするまでの間に,そのSELECT文中で使用している表に対して,ほかのユーザが定義系SQL文を発行すると,定義系SQLは排他待ちの状態になります。また,ホールダブルカーソルを使用したSELECT文に対する前処理が有効な間に,そのSELECT文中で使用している表に対して,ほかのユーザが定義系SQL文を発行すると,定義系SQLは排他待ちの状態になります。

    注※

    プラグインのホールダブルカーソルへの対応状況については,ディクショナリ表SQL_PLUGINSのPLUGIN_HOLDABLE列で確認できます。ディクショナリ表SQL_PLUGINSについては,マニュアル「HiRDB UAP開発ガイド」を参照してください。

(5) 参照制約に関する規則

  1. ホールダブルカーソルを使用して,外部キーの定義されている表を検索している場合,検索中の表が検査保留状態となったときには,カーソルは閉じた状態になります。

(6) 留意事項

  1. FOR UPDATEを指定すると作業表が作成されるのでカーソルを使用して検索中の表に対して,行の更新,追加,又は削除をしない場合は,このオペランドを省略してください。

  2. SQL最適化オプションの更新SQLの作業表作成抑止を適用して,更にインデクスキー値無排他機能を使用すると,FOR UPDATE又はFOR UPDATE OFを指定しないカーソルの使用中に,行の更新,追加,又は削除ができます。

(7) 使用例

使用例については,「DECLARE CURSOR 形式1(カーソル宣言)」,及び「ALLOCATE CURSOR文 形式1(文カーソル割当て)」を参照してください。