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