5

パラメータ付きのPL/SQLプロシージャがありOUTます。OUTエラーが発生した場合でも、パラメータ値を強制的に書き込むにはどうすればよいですか?エラーが発生したときに値を返すための別のメカニズムはありますか?

4

2 に答える 2

6

@APCの回答を拡張するために、ドキュメントには次のように書かれています。

サブプログラムを正常に終了すると、PL/SQLは値をOUTパラメータに割り当てます。ただし、未処理の例外で終了した場合、PL / SQLはOUTパラメータに値を割り当てません(NOCOPYパラメータでない限り)。

説明に役立つ可能性のあるいくつかの例を次に示します。

SQL> set serveroutput on
SQL> REM Example 1 -- OUT parameter value is unchanged if an exception was raised after value was assigned
SQL> declare
  2      x number := 1;
  3      procedure p(x out number)
  4      as
  5      begin
  6          x := 2;
  7          raise program_error;
  8      end p;
  9  begin
 10      p(x);
 11  exception
 12      when program_error then
 13          dbms_output.put_line
 14          (
 15              case
 16                  when x is null then 'null'
 17                  else to_char(x)
 18              end
 19          );
 20  end;
 21  /
1                                                                               

PL/SQL procedure successfully completed.

SQL> REM Example 2 -- OUT parameter value is unchanged if value was set in exception handler and exception was then re-raised
SQL> declare
  2      x number := 1;
  3      procedure p(x out number)
  4      as
  5      begin
  6          x := 2;
  7          raise program_error;
  8      exception
  9          when program_error then
 10              x := 3;
 11              raise;
 12      end p;
 13  begin
 14      p(x);
 15  exception
 16      when program_error then
 17          dbms_output.put_line
 18          (
 19              case
 20                  when x is null then 'null'
 21                  else to_char(x)
 22              end
 23          );
 24  end;
 25  /
1                                                                               

PL/SQL procedure successfully completed.

SQL> REM Example 3 -- OUT parameter value is changed if value was set in exception handler and exception was not re-raised
SQL> declare
  2      x number := 1;
  3      procedure p(x out number)
  4      as
  5      begin
  6          x := 2;
  7          raise program_error;
  8      exception
  9          when program_error then
 10              x := 3;
 11      end p;
 12  begin
 13      p(x);
 14      dbms_output.put_line
 15      (
 16          case
 17              when x is null then 'null'
 18              else to_char(x)
 19          end
 20      );
 21  end;
 22  /
3                                                                               

PL/SQL procedure successfully completed.

SQL> REM Example 4 -- OUT NOCOPY parameter value is changed if an exception was raised
SQL> declare
  2      x number := 1;
  3      procedure p(x out nocopy number)
  4      as
  5      begin
  6          x := 2;
  7          raise program_error;
  8      end p;
  9  begin
 10      p(x);
 11  exception
 12      when program_error then
 13          dbms_output.put_line
 14          (
 15              case
 16                  when x is null then 'null'
 17                  else to_char(x)
 18              end
 19          );
 20  end;
 21  /
2                                                                               

PL/SQL procedure successfully completed.
于 2012-11-02T13:46:26.423 に答える
4

PL / SQLプログラムで例外が発生した場合、OracleはOUTパラメータに値を割り当てません。これが安全機能である場合、既知の一貫した状態ですべてのパラメーターが提供されるため

しかし、それが私たちが望んでいることではない場合もあります。たとえば、OUTパラメータを使用して、エラーメッセージやその他の役立つ情報を呼び出し元のプログラムに渡すことができます。プログラムのEXCEPTIONSセクションでOUTパラメータを設定できます。これらの値は渡されます(ハンドラー自体が例外を発生させない限り)。

于 2012-11-02T12:23:16.277 に答える