我在 plsql 中编写过程和函数的方式有啥问题?

Posted

技术标签:

【中文标题】我在 plsql 中编写过程和函数的方式有啥问题?【英文标题】:what is wrong with the way I write procedures and functions in plsql?我在 plsql 中编写过程和函数的方式有什么问题? 【发布时间】:2022-01-19 06:21:06 【问题描述】:
1   declare
2   a number;
3   b number;
4   c number;
5   d number;
6   PROCEDURE findMin(x IN number, y IN number, z IN number , L out number) IS
7   BEGIN
8   IF x > y&& x>z then
9   L:= x;
10  ELSE if y>z&&y>x then
11  L:= y;
12  else
13  L:=z
14  END IF;
15  End if;
16  END;
17  BEGIN
18  a:= 23;
19  b:= 45;
20  c:=36;
21  findMin(a, b, c,d);
22  dbms_output.put_line(' Minimum of (23, 45,36) : ' || d);
 END;

这是第一个我无法理解它显示的代码有什么问题 * 第 1 行的错误: ORA-06540​​: PL/SQL: 编译错误 ORA-06553: PLS-906: 编译是不可能的

第二个是

2.   DECLARE 
3.  num number; 
4.  c number; 
5.  PROCEDURE fact(x IN number, f out number) IS 
6.  BEGIN 
7.  IF x = 0 THEN 
8.  f:= x; 
9.  ELSE 
10. f:= x*fact(x-1); 
11. END IF; 
12. END;   
13. BEGIN 
14. c:=f;
15. num:=6
16. fact(num,c); 
17. dbms_output.put_line(' Factorial: ' ||'is'||c); 
18. END; 
19. /

我得到的输出为 z:= x*fact(x-1) ; * 第 9 行的错误: ORA-06550:第 9 行,第 14 列: PLS-00306:调用“FACT”时参数的数量或类型错误 ORA-06550:第 9 行,第 8 列: PL/SQL:语句被忽略

这是我编写的第二个程序,但我无法解决其中的问题

  1  create or replace  function tables(n in number) return number is s number;
  2  begin
  3   i number;
  4  for i in 1...10 loop
  5  s:=n*i;
  6  end loop;
  7  return s ;
  8* end;

这是乘法表函数我的代码有什么问题,它们将输出显示为

警告:函数创建时出现编译错误。

【问题讨论】:

一些缩进不会有伤害,你应该详细解释你的例子中什么不起作用。 先生,我编辑了问题 【参考方案1】:

从您的第一个代码开始:您应该使用AND,而不是&&,并用冒号终止语句。修复后,它运行(虽然会产生错误的结果,但我会留给你):

SQL> DECLARE
  2     a  NUMBER;
  3     b  NUMBER;
  4     c  NUMBER;
  5     d  NUMBER;
  6
  7     PROCEDURE findMin (x  IN     NUMBER,
  8                        y  IN     NUMBER,
  9                        z  IN     NUMBER,
 10                        L     OUT NUMBER)
 11     IS
 12     BEGIN
 13        IF     x > y
 14           AND x > z
 15        THEN
 16           L := x;
 17        ELSE
 18           IF     y > z
 19              AND y > x
 20           THEN
 21              L := y;
 22           ELSE
 23              L := z;
 24           END IF;
 25        END IF;
 26     END;
 27  BEGIN
 28     a := 23;
 29     b := 45;
 30     c := 36;
 31     findMin (a,
 32              b,
 33              c,
 34              d);
 35     DBMS_OUTPUT.put_line (' Minimum of (23, 45,36) : ' || d);
 36  END;
 37  /
Minimum of (23, 45,36) : 45

PL/SQL procedure successfully completed.

SQL>

所有这些(37 行代码)都可以缩短为只有一个(实际可行):

SQL> select least(23, 45, 36) minimum from dual;

   MINIMUM
----------
        23

SQL>

从您的第二个代码开始:程序错误,因为 fact 不能这样使用并且缺少第二个参数。修复它的一种选择是

SQL> DECLARE
  2     num  NUMBER;
  3     c    NUMBER;
  4
  5     PROCEDURE fact (x IN NUMBER, f OUT NUMBER)
  6     IS
  7        l_var  NUMBER := 1;
  8     BEGIN
  9        FOR i IN 1 .. x
 10        LOOP
 11           l_var := l_var * i;
 12        END LOOP;
 13
 14        f := l_var;
 15     END;
 16  BEGIN
 17     num := 6;
 18     fact (num, c);
 19     DBMS_OUTPUT.put_line (' Factorial of ' || num || ' is ' || c);
 20  END;
 21  /
Factorial of 6 is 720

PL/SQL procedure successfully completed.

SQL>

最后,第三个代码:我不明白你的意思,它充满了错误。我尝试挽救它,不知道我是否成功。

SQL> CREATE OR REPLACE FUNCTION tables (n IN NUMBER)
  2     RETURN NUMBER
  3  IS
  4     s  NUMBER := 0;
  5  BEGIN
  6     FOR i IN 1 .. 10
  7     LOOP
  8        s := s + n * i;
  9     END LOOP;
 10
 11     RETURN s;
 12  END;
 13  /

Function created.

SQL> SELECT tables (3) FROM DUAL;

 TABLES(3)
----------
       165

SQL>

【讨论】:

我想找到显示数字乘法表的函数

以上是关于我在 plsql 中编写过程和函数的方式有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL 创建一个从其他方案调用过程和函数的包

使用 PLSQL 创建过程

PLSQL 中的 WHILE 循环有啥问题?

我用plsql创建的存储过程为啥是无效的?

从 PLSQL 中所有动态找到的表中获取数据时遇到问题

在plsql中编写函数