ORACLE SQL リファレンス(逆引き)


Web oracle.se-free.com
SELECTした行をロックする(SELECT〜FOR UPDATE)
スポンサード リンク

SELECTした行をロックするには、FOR UPDATE句を使用します。
FOR UPDATE
[ OF 表.列名 ]
[ WAIT [ 待機時間 ] | NOWAIT ]
OF句
表を結合する場合に使用し、表とその列名を指定します。
OF句で指定した表のSELECTしたレコードがロックされますが、OF句で指定してない表はロックされません。
OF句で指定する列名は対象表の列ならなんでも良いです。
OF句を指定しない場合は、SELECT対象の表のレコードは全てロックされます。

WAIT句
対象レコードにロックがかかっていた時に、ロックが開放されるまで待機します。
待機時間が指定してある場合は、ロックが開放されるまで最大で、指定した待機時間まで待機します。待機時間を超えた場合は、下記エラーで復帰します。(9i以降)
「ORA-30006: リソース・ビジー; WAITタイムアウトの期限に達しました。」
WAIT句またはNOWAIT句の両方していしてない場合は、ロックが開放されるまで待機します。

NOWAIT句
対象レコードにロックがかかっていた時に、開放を待たずに下記エラーで復帰します。
「ORA-00054: リソース・ビジー、NOWAITが指定されていました。」

※制限事項
DISTINCT演算子またはCURSOR式、集合演算子(UNION / INTERSECT / MINUS)、GROUP BYまたは集計関数とともに指定することはできません。

 

例1) 表「emp」と表「dept」のSELECTレコードは全てロックする。
SELECT時にロックがかかっていた場合は、ロックが開放されるまで待機する。
select e.emp_id,d.dept_id,e.name
from emp e,dept d
where e.dept_id = d.dept_id
for update;


例2) 表「emp」のSELECTレコードのみロックし、表「dept」のSELECTレコードはロックしない。
SELECT時にロックがかかっていた場合は、ロックが開放されるまで待機する。
select e.emp_id,d.dept_id,e.name
from emp e,dept d
where e.dept_id = d.dept_id
for update of e.emp_id;


例3) 表「emp」と表「dept」のSELECTレコードは全てロックする。
SELECT時にロックがかかっていた場合は、ロックが開放されるまで最大30秒待機する。
select e.emp_id,d.dept_id,e.name
from emp e,dept d
where e.dept_id = d.dept_id
for update wait 30;


例4) 表「emp」と表「dept」のSELECTレコードは全てロックする。
SELECT時にロックがかかっていた場合は、開放まで待機せず即座に復帰する。
select e.emp_id,d.dept_id,e.name
from emp e,dept d
where e.dept_id = d.dept_id
for update nowait;


スポンサード リンク



シーケンス(順序)の取得(SEQUENCE)
SELECTした行をロックする(SELECT〜FOR UPDATE)
文字列を暗号化してINSERT・UPDATEする/複合化してSELECTする(10g)
項目のバイト数を取得する( VSIZE )
組織の階層構造を出力する( SYS_CONNECT_BY_PATH )
SELECT結果を見やすくする(CHR)
データのダンプを取得する(DUMP)

SQL(DML2) へ
忘れっぽいエンジニアのオラクルSQLリファレンス TOPへ