[英]PL/SQL CREATE PROCEDURE - factorial
我不知道我的代码块有什么问题来创建一个程序来找出一个数字的阶乘。 谢谢你。
-- 问题 1 - 编写一个存储过程,它获取一个 integer 数字 n 并 -- 计算并显示其阶乘。
SET SERVEROUTPUT ON;
CREATE OR REPLACE PROCEDURE factorial_number(
n NUMBER) AS
factorial NUMBER;
num Number;
BEGIN
FOR i IN REVERSE 1..n LOOP
num := i - 1;
factorial := factorial * num;
END LOOP;
DBMS_OUTPUT.PUT_LINE (factorial);
EXCEPTION
WHEN OTHERS
THEN DBMS_OUTPUT.PUT_LINE ('Error!');
END;
/
BEGIN
factorial_number(5);
END;
/
怎么样
SQL> CREATE OR REPLACE PROCEDURE factorial_number (n NUMBER)
2 AS
3 factorial NUMBER := 1;
4 BEGIN
5 FOR i IN 1 .. n
6 LOOP
7 factorial := factorial * i;
8 END LOOP;
9
10 DBMS_OUTPUT.PUT_LINE (factorial);
11 END;
12 /
Procedure created.
SQL>
SQL> BEGIN
2 factorial_number (5);
3 END;
4 /
120
PL/SQL procedure successfully completed.
SQL>
factorial
。 未初始化的变量最初是null
并将null
乘以任何值都会产生null
。i = 1
时,您将factorial
乘以 0,这意味着(假设您初始化factorial
),您总是以 0 结束。您想要乘以i
,因此不需要局部变量num
.如果我做这些修复
CREATE OR REPLACE PROCEDURE factorial_number(
n NUMBER)
AS
factorial NUMBER := 1; -- Initialize
BEGIN
FOR i IN 1..n LOOP -- Loop normally
dbms_output.put_line( 'Beginning iteration ' || i || ' of loop. ' ||
'Factorial = ' || factorial ||
' multiplying by ' || i );
factorial := factorial * i; -- Multiply by i not i-1
END LOOP;
DBMS_OUTPUT.PUT_LINE (factorial);
EXCEPTION
WHEN OTHERS
THEN DBMS_OUTPUT.PUT_LINE ('Error!');
END;
然后
BEGIN
factorial_number(5);
END;
将打印出 120 ( 5*4*3*2*1
)。
我还添加了一个额外的dbms_output
行,以在循环的每次迭代中打印出变量的当前 state。 这是一种相对老式的调试方法。 在现代世界中,您将使用调试器浏览代码,您可以在其中查看局部变量的值,但入门类最初可能不会教授调试器的使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.