【问题标题】:PL/SQL CREATE PROCEDURE - factorialPL/SQL CREATE PROCEDURE - 阶乘
【发布时间】:2022-01-07 18:43:56
【问题描述】:

我不知道我的代码块有什么问题来创建一个程序来找出一个数字的阶乘。谢谢。

问题1:编写一个存储过程,获取一个整数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;
/

【问题讨论】:

  • 调试代码的最佳方法是将 dbms_output 语句放入循环中,以便查看每次迭代发生的情况。

标签: sql oracle plsql


【解决方案1】:
  1. 您未能初始化局部变量factorial。未初始化的变量最初是null,将null 乘以任何值都会产生null
  2. 我不明白您为什么希望循环以相反的顺序运行。没关系,因为乘法是可交流的,但它不太可能使您的代码更易于阅读/调试/遵循。
  3. 您不想在循环的每次迭代中从乘以的值中减去 1。例如,当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 行,以在循环的每次迭代中打印出变量的当前状态。这是一种相对老式的调试方法。在现代世界中,您会使用调试器浏览代码,您可以在其中查看局部变量的值,但入门类最初可能不会教授调试器的用法。

【讨论】:

  • 这行得通。非常感谢您的详尽解释。
【解决方案2】:

怎么样

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>

【讨论】:

  • 假设您可以删除 num 局部变量,因为您不再使用它。
  • 显然;谢谢你,@贾斯汀。
猜你喜欢
  • 2022-01-08
  • 2022-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多