Чтение из параметра только для записи (OUT) в pl / sql - PullRequest
2 голосов
/ 18 мая 2010

Когда я пытался записать в параметр только для чтения (IN) функции, Oracle жалуется на ошибку. Но это не тот случай, когда при чтении из параметра только для записи (OUT) функции. Oracle молча позволяет это без каких-либо ошибок. В чем причина такого поведения? Следующий код выполняется без какого-либо присваивания переменной «so»:

create or replace function foo(a OUT number) return number
  is
    so number;
  begin
    so := a; --no assignment happens here
    a := 42;
    dbms_output.put_line('HiYA there');
    dbms_output.put_line('VAlue:' || so);
    return 5;
  end;
/

declare 
  somevar number;
  a number := 6;
begin
  dbms_output.put_line('Before a:'|| a);
  somevar := foo(a);
  dbms_output.put_line('After a:' || a);
end;
/

Вот вывод, который я получил:

Before a:6
HiYA there
VAlue:
After a:42

1 Ответ

6 голосов
/ 18 мая 2010

Чтение из параметра OUT разрешено: вы могли бы записать что-либо в свой параметр OUT в начале процедуры, и вы можете захотеть прочитать значение, которое оно содержит, прежде чем возвращать, это не ошибка.

Здесь происходит то, что, поскольку это параметр OUT, а не параметр IN OUT, значение a не передается функции foo, поэтому в начале процедуры параметр OUT a содержит значение NULL. Вы можете проверить это, закомментировав строку a := 42;:

SQL> create or replace function foo(a OUT number) return number
  2    is
  3      so number;
  4    begin
  5      so := a; --no assignment happens here
  6      /*a := 42;*/
  7      dbms_output.put_line('HiYA there');
  8      dbms_output.put_line('VAlue:' || so);
  9      return 5;
 10    end;
 11  /

Function created
SQL> declare
  2    somevar number;
  3    a number := 6;
  4  begin
  5    dbms_output.put_line('Before a:'|| a);
  6    somevar := foo(a);
  7    dbms_output.put_line('After a:' || a);
  8  end;
  9  /

Before a:6
HiYA there
VAlue:
After a:
         ^^ as you can see an OUT parameter is effectively "NULLed" at the
            beginning of a call
...