我在 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 中编写过程和函数的方式有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章