PL/SQLプログラムを途中で終了するにはどうすればよいですか。例外が発生した場合、プログラムを正常に終了する方法を見つけることができませんでした。処理すると、コードにループバックします。
基本的に私がやりたいことは、アプリを特定の条件で実行しないように強制することです。だから、私はこのようなものをプログラムの先頭に追加したいと思います:
BEGIN
IF [condition]
EXIT
END IF
[the rest of the program]
END
提案された方法は例外をスローすることですが、ブロックは内部ブロックである可能性があるため、ブロック外のプログラムはそのまま続行します。
RETURNを使用できます
MWATSON@> set serveroutput on
MWATSON@> !cat test.sql
BEGIN
IF 1 = 1 THEN
DBMS_OUTPUT.PUT_LINE('ABOUT TO EXIT');
RETURN;
END IF;
DBMS_OUTPUT.PUT_LINE('DID NOT EXIT');
END;
MWATSON@> @test
8 /
ABOUT TO EXIT
PL/SQL procedure successfully completed.
MWATSON@>
回答するには遅すぎることはわかっていますが、以前の回答で言及されていない方法がもう1つあります。
RAISE_APPLICATION_ERRORを使用して、この例外をEXCEPTIONセクションでキャッチしてください。これにより、コミットされていないトランザクションがロールバックされるため、必要に応じてそれらを明示的にコミットしてください。
これにより、RETURNを使用するときにIFブロックで例外処理を実行する代わりに、プログラムから正常に戻ることができます。
参考にした。 http://www.plsql-tutorial.com/plsql-exception-handling.htm
ブロックが処理しない例外を発生させると、例外は常に呼び出し元に発生します。したがって、処理を停止する最も簡単な方法は、呼び出しスタックのどこでも処理されない例外を発生させることです。
例えば.
DECLARE
e_halt_processing EXCEPTION;
BEGIN
IF [condition] THEN
RAISE e_halt_processing;
END IF;
[the rest of the program]
END;
私はPL/SQLを知りませんが、なぜあなたの言葉を使ってみませんか:
BEGIN
IF [!condition]
[the rest of the program]
END IF
END
考えてただけ
順次(ネストされていない)pl/sqlブロックと個別の例外処理を使用している限り、RAISEは完全に機能します。ネストされたブロックで例外を発生させる場合は、競合状態に注意してください。