A parameter passed in OUT mode or IN OUT mode can not have a default value and can not be passed as a literal. Let's go to the basic:
create or replace procedure p_inout (p_in varchar2 default null, p_val IN OUT number) is
begin
p_val := p_val*10;
dbms_output.put_line(' p_val is ' || p_val);
end;
/
SQL> exec p_inout ('a', 1);
BEGIN p_inout ('a', 1); END;
*
ERROR at line 1:
ORA-06550: line 1, column 21:
PLS-00363: expression '1' cannot be used as an assignment target
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
The right way to call the procedure is to define a variable first (and assign a vaule to it for the IN OUT mode), and then pass the variable to the procedure:
SQL> set serveroutput on;
SQL> var inout number
SQL> exec :inout := 1
PL/SQL procedure successfully completed.
SQL> print inout
INOUT
----------
1
SQL> exec p_inout ('a', :inout);
p_val is 10
PL/SQL procedure successfully completed.
SQL> print inout
INOUT
----------
10
--
-- A block using the OUT value
--
SQL> declare
v1 NUMBER := 1;
v2 NUMBER := 0;
BEGIN
p_inout('aa', v1);
v2:= v1 + 50;
dbms_output.put_line(' v2 uses the OUT value, and equals ' || v2);
END;
/
p_val is 10
v2 uses the OUT value, and equals 60
PL/SQL procedure successfully completed.
SQL>