web-dev-qa-db-ja.com

PL / SQLプログラムを中止する

PL/SQLプログラムを途中で終了するにはどうすればよいですか。例外が発生した場合、プログラムを正常に終了する方法を見つけることができませんでした。処理すると、コードにループバックします。

基本的に私がやりたいことは、アプリを特定の条件で実行しないように強制することです。だから、私はこのようなものをプログラムの先頭に追加したいと思います:

BEGIN
    IF [condition]
        EXIT
    END IF
    [the rest of the program]
END

提案された方法は例外をスローすることですが、ブロックは内部ブロックである可能性があるため、ブロック外のプログラムはそのまま続行します。

18
Margaret

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@> 
50
Matthew Watson

回答するには遅すぎることはわかっていますが、以前の回答で言及されていない方法がもう1つあります。

RAISE_APPLICATION_ERRORを使用して、この例外をEXCEPTIONセクションでキャッチしてください。これにより、コミットされていないトランザクションがロールバックされるため、必要に応じてそれらを明示的にコミットしてください。

これにより、RETURNを使用するときにIFブロックで例外処理を実行する代わりに、プログラムから正常に戻ることができます。

参考にした。 http://www.plsql-tutorial.com/plsql-exception-handling.htm

4
KLeonine

ブロックが処理しない例外を発生させると、例外は常に呼び出し元に発生します。したがって、処理を停止する最も簡単な方法は、呼び出しスタックのどこでも処理されない例外を発生させることです。

例えば.

DECLARE
    e_halt_processing EXCEPTION;
BEGIN
    IF [condition] THEN
        RAISE e_halt_processing;
    END IF;
    [the rest of the program]
END;
2
Jeffrey Kemp

私はPL/SQLを知りませんが、なぜあなたの言葉を使ってみませんか:

BEGIN
    IF [!condition]
        [the rest of the program]
    END IF
END

考えてただけ

1
victor hugo

順次(ネストされていない)pl/sqlブロックと個別の例外処理を使用している限り、RAISEは完全に機能します。ネストされたブロックで例外を発生させる場合は、競合状態に注意してください。

0
Mac