カーソルをループしていくつかのロジックを実行する以下の手順があります。別のセッションの誰かが同じセットを更新したい場合、私はレコードセットをロックするためにカーソルにFOR UPDATE NOWAITを入れました。ループ内のOracle PL/SQLキャプチャロック例外
しかし、カーソルで選択したレコードが誰かによってロックされているシナリオがあるかもしれません。その場合、ロックされたレコードをログテーブルに単に記録し、次のレコードに続けますループ。テスト用
PROCEDURE test(p_id IN NUMBER)
IS
CURSOR cur_test IS
SELECT emp_id,
emp_name
FROM
EMP
FOR UPDATE NOWAIT;
row_locked EXCEPTION;
PRAGMA EXCEPTION_INIT(row_locked, -54);
BEGIN
FOR r_cur_test IN cur_test
LOOP
BEGIN
--do something
EXCEPTION
WHEN row_locked THEN
--log locked record in log table
log_lock('Record is locked');
COMMIT;
END;
END LOOP;
--call log function to log a successful run
COMMIT;
EXCEPTION
WHEN OTHERS THEN
--Unsuccessful completion of the run.Trap all unhandled exceptions.
--log error in error table
log_lock('Process exited with error');
ROLLBACK;
END;
、Iは、セッション1を開き、
select * from EMP FOR UPDATE NOWAIT
を実行し、セッション2で、私はそれが常に結果として、OTHERS例外に行っ
begin
test(1);
end;
を実行プロシージャはカーソルをループし続けることなく終了しました。
誰かから助言をいただけますか?おかげでたくさんの
他のブロックの例外は何ですか?これは混乱です。 – OldProgrammer
カーソルforループの後ろにコードがあり、他のブロックが例外である場合は例外があります。 –
だから、例外は何ですか?関連するすべての情報を提供できない場合は、どのようにして誰かがあなたを手伝うことを期待していますか? – OldProgrammer