Вам нужно преобразовать создание процедуры следующим образом:
SQL> CREATE OR REPLACE PROCEDURE fact(x IN OUT number, fact OUT number) IS
BEGIN
while x > 0 loop
fact := x * nvl(fact, 1);
x := x - 1;
END loop;
END;
/
и вызвать:
SQL> SET SERVEROUTPUT ON;
SQL> DECLARE
x number := &x;
v_fact number := 1;
BEGIN
fact(x, v_fact);
dbms_output.put_line('Factorial is: ' || v_fact);
END;
Factorial is: 120
- Вы не можете использовать переменную типа
IN
какцель назначения - Вам нужно инициализировать нулевую переменную
fact
как nvl(fact,1)
или fact := 1;
непосредственно перед while x > 0
На самом деле, вам даже не нужнодополнительный параметр fact OUT number
для процедуры с именем fact
и сделайте его локальным.Таким образом, ваша процедура может быть заменена следующим:
SQL> CREATE OR REPLACE PROCEDURE fact(x IN OUT number) IS
fact number := 1;
BEGIN
while x > 0 loop
fact := x * fact;
x := x - 1;
end loop;
x := fact;
END;
/
Следовательно, следует вызывать как:
SQL> DECLARE
x number := &x;
BEGIN
fact(x);
dbms_output.put_line('Factorial is: ' || x);
END;
Factorial is: 120