2012-11-02 7 views

Odpowiedz

5

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. 
+0

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. –

+0

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ść. –

4

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).

+0

można podać odniesienia dla tego (określający params null)? –

+0

Tylko niewielkie wyjaśnienie. To nie zadziała, jeśli złapany wyjątek zostanie ponownie podniesiony. – Ben

+0

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. –