【问题标题】:Print sum of n numbers in plsql在plsql中打印n个数字的总和
【发布时间】:2019-04-21 05:15:40
【问题描述】:
CREATE OR REPLACE FUNCTION printsum(n IN number) IS
res number:=0;
BEGIN
while(n>0)
LOOP
res:=res+n;
n:=n-1;
EXIT WHEN n=0;
END LOOP;
dbms_output.put_line(' result of sum: '||res);
END;
/

我正在尝试打印 n 个数字的总和,但出现以下错误:

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

【问题讨论】:

    标签: plsql sum plsqldeveloper


    【解决方案1】:

    两件事:

    1. 严格来说,数字不一定是整数,所以最好使用 pls_integer 或至少检查代码中传入的参数是整数
    2. 如果问题是问如何返回前n个正整数之和,正确答案是使用闭式公式:n * (n + 1)/2

    使用公式可以得到一个恒定的时间答案。

    function printsum(n pls_integer) return n is
    begin
      if(n < 0) then raise value_error; end if; -- or a more meaningful exception
      return (n * (n + 1) / 2);
    end;
    

    【讨论】:

      【解决方案2】:

      您的代码中几乎没有错误。

      1) Function 必须有 Return,但您的代码在开头和结尾都缺少 Return 语句。

      2) IN 参数不能在代码内重新分配。所以需要将IN参数复制到一个变量中进行迭代。

      试试这个:

      CREATE OR REPLACE FUNCTION printsum( n IN NUMBER)
          RETURN NUMBER
        IS
          res   NUMBER:=0;
          v_num NUMBER:=n;
        BEGIN        
          WHILE(v_num>0)
          LOOP
            res   := res   + v_num;
            v_num := v_num -1;
            EXIT  WHEN v_num=0;        
          END LOOP;
      
          dbms_output.put_line(' result of sum: '||res);
      
          RETURN(res);      
        END;
        / 
      

      输出:

      SQL> select printsum(10) from dual;
      
      PRINTSUM(10)
      ------------
                55
      

      【讨论】:

        【解决方案3】:

        下面的代码sn -p就是解决办法:

        declare
          sm number;
          tmp number;
          n number;
          i number;
        function sumn(n integer)
        return number
        is
        sm number;
        begin
           sm:=0;
        tmp:=n;
        for i in 1..tmp LOOP
            sm:=sm+i;
        END LOOP;
        return sm;
        END;
        begin
           n:=10;
           sm:=sumn(n);
            dbms_output.put_line('sum is',sm);
        end;
        /
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-12
          • 1970-01-01
          • 1970-01-01
          • 2021-12-30
          • 2022-12-18
          • 1970-01-01
          • 1970-01-01
          • 2022-11-30
          相关资源
          最近更新 更多