Чтение из параметра 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