PL/SQL编写求阶乘存储过程代码运行错误问题求助
你的代码存在以下几个问题:
- 变量未初始化:
factorial声明后没有赋值初始值,Oracle中未初始化的变量默认值为NULL,NULL参与任何数值运算结果都是NULL,最终无法得到正确结果 - 循环逻辑错误:你使用
REVERSE 1..n倒序循环,每次取值i-1参与计算,首先会漏掉乘n本身,其次循环到i=1时i-1=0,最终结果会被乘0归零 - 缺少参数合法性校验:没有对输入参数
n的合法性做判断,若输入负数、0或者非整数,只会返回模糊的错误提示,无法定位问题 - 多余变量定义:
num变量完全没有存在的必要,可以直接在循环内计算
修正后的代码如下:
SET SERVEROUTPUT ON; CREATE OR REPLACE PROCEDURE factorial_number( n NUMBER) AS factorial NUMBER := 1; -- 初始化阶乘初始值为1 BEGIN -- 参数合法性校验 IF n < 0 OR MOD(n,1) != 0 THEN DBMS_OUTPUT.PUT_LINE ('Error:请输入正整数参数'); RETURN; END IF; -- 0的阶乘为特殊情况直接输出 IF n = 0 THEN DBMS_OUTPUT.PUT_LINE (factorial); RETURN; END IF; -- 修正循环逻辑,从1累乘到n即可 FOR i IN 1..n LOOP factorial := factorial * i; END LOOP; DBMS_OUTPUT.PUT_LINE (factorial); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE ('Error! 错误信息:'||SQLERRM); END; / -- 测试调用 BEGIN factorial_number(5); -- 输出120 factorial_number(0); -- 输出1 factorial_number(-3); -- 输出参数错误提示 END; /
内容的提问来源于stack exchange,提问作者user17558975
相关产品推荐
相关产品推荐

