Процедура plsql не является процедурой или не определена - PullRequest
1 голос
/ 20 апреля 2019

Я хочу создать процедуру plsql для вычисления факториала данного числа.

Это процедура:

CREATE OR REPLACE PROCEDURE fact(x IN number, fact OUT number)
IS
BEGIN
while x > 0 loop
fact := x*fact;
x := x-1;
END loop;
END;
/

Warning: Procedure created with compilation errors.

и этогде я вызываю функцию

DECLARE
x number := &x;
fact number  := 1;
BEGIN
fact(x,fact);
dbms_output.put_line('Factorial is: '||fact);
END;

, и вот ошибка, которую я получаю:

Enter value for x: 5
old   2: x number := &x;
new   2: x number := 5;
fact(x,fact);
*
ERROR at line 5:
ORA-06550: line 5, column 1:
PLS-00221: 'FACT' is not a procedure or is undefined
ORA-06550: line 5, column 1:
PL/SQL: Statement ignored

Ответы [ 2 ]

3 голосов
/ 20 апреля 2019

Вам нужно преобразовать создание процедуры следующим образом:

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
1 голос
/ 20 апреля 2019

Вы можете рассмотреть возможность переписать это как функцию в соответствии со следующим:

CREATE OR REPLACE FUNCTION fact(pinX IN INT)
  RETURN INT
IS
  nResult INT := 1;
BEGIN
  FOR i IN 2..pinX LOOP
    nResult := i * nResult;
  END LOOP;

  RETURN nResult;
END FACT;

dbfiddle здесь

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...