Mam procedurę PL/SQL z parametrem OUT
. Jak mogę wymusić zapisanie wartości parametrów OUT
, nawet jeśli wystąpił błąd? Czy istnieje inny mechanizm zwracania wartości po zgłoszeniu błędu?Wartości parametrów OUT OUT mogą być zapisane, nawet jeśli procedura PL/SQL powoduje błąd?
Odpowiedz
Aby rozwinąć na odpowiedź @ APC, tym documentation mówi:
Jeśli opuścić podprogram powodzeniem, PL/SQL przypisuje wartości do parametrów OUT. Jeśli jednak wyjdziesz z nieobsługiwanym wyjątkiem, PL/SQL nie przypisuje wartości parametrom OUT (chyba że są to parametry NOCOPY).
Oto kilka przykładów, które mogą pomóc zilustrować:
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.
Gdy program PL/SQL zgłasza wyjątek Oracle nie przypisuje wartości parametrom OUT. Jeśli jest to funkcja bezpieczeństwa, ponieważ daje nam wszystkie parametry w znanym i zgodnym stanie. Niekiedy nie jest to tym, czego chcemy. Na przykład, możemy chcieć użyć parametru OUT, aby przekazać programowi wywołującemu komunikat o błędzie lub inne pomocne informacje. Możemy ustawić parametry OUT w sekcji WYŁĄCZENIA programu. Wartości te są pomijane (chyba, że przewodnik poruszy wyjątek).
można podać odniesienia dla tego (określający params null)? –
Tylko niewielkie wyjaśnienie. To nie zadziała, jeśli złapany wyjątek zostanie ponownie podniesiony. – Ben
Myślę, że wartość ** nie zostanie zmieniona **, jeśli procedura zakończy się z wyjątkiem. Null dzieje się tylko wtedy, gdy wartość była zerowa przed uruchomieniem programu PL/SQL. –
Myślę, że tutaj jest brakujące. w niektórych przykładach wartość jest pusta, ponieważ nie została zainicjowana. jeśli zadeklarujemy 'x number: = 7;' wtedy wartość pozostanie 7 w przykładach 1 i 2. –
Dzięki za wskazanie tego, @Florin Ghita. Zmodyfikowaliśmy przykłady, aby zainicjować wartość x, aby było jaśniejsze, gdy zmieni się jego wartość. –