plsql过程不是一个过程或未定义

问题描述 投票:1回答:2

我想创建一个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
oracle plsql
2个回答
3
投票

您需要转换您创建的过程,如下所示:

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
投票

您可以考虑将此重写为以下行中的函数:

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 here

祝你好运。

© www.soinside.com 2019 - 2024. All rights reserved.