Oracle PL / SQL:在函数上返回没有值的错误

时间:2014-10-25 09:54:12

标签: sql oracle function plsql

我正在尝试创建一个为factorial计算的函数,但是当我执行SELECT FACTORIAL('1') FROM DUAL;时会返回错误

它返回令人发指的error:function returned without value。我尝试添加一个异常,但它似乎也无效。关心帮忙?

    CREATE OR REPLACE FUNCTION FACTORIAL(p_factorial INTEGER) 
      RETURN NUMBER
       AS var_fnumber number(2);
       ctr number(2);
       var_contain number(2) := 1;
    BEGIN
       FOR ctr in 1..p_factorial 
    LOOP
      BEGIN
          var_contain := var_contain * ctr;
          DBMS_OUTPUT.put_line(var_contain);
      EXCEPTION
          WHEN OTHERS THEN
          RETURN 0;
      END;
    END LOOP;

  END; --FACTORIAL;
  /

3 个答案:

答案 0 :(得分:2)

你必须在函数中返回一些内容。

SQL> CREATE OR REPLACE
  2    FUNCTION FACTORIAL(
  3        p_factorial INTEGER)
  4      RETURN NUMBER
  5    AS
  6      var_fnumber NUMBER(2);
  7      ctr         NUMBER(2);
  8      var_contain NUMBER(2) := 1;
  9    BEGIN
 10      FOR ctr IN 1..p_factorial
 11      LOOP
 12        BEGIN
 13          var_contain := var_contain * ctr;
 14        END;
 15      END LOOP;
 16      RETURN var_contain;
 17    END;
 18    /

Function created.

SQL>
SQL> SELECT factorial(2) FROM dual
  2  /

FACTORIAL(2)
------------
           2

有关详情,请参阅http://lalitkumarb.wordpress.com/2014/05/01/ora-06503-plsql-function-returned-without-value/

答案 1 :(得分:0)

修改你的代码试试这个:

create or replace
FUNCTION FACTORIAL(p_factorial INTEGER) 
RETURN VARCHAR2
AS
var_contain varchar2(50):= 1;
BEGIN
FOR ctr in 1..p_factorial 
LOOP
var_contain := var_contain * ctr;
END LOOP;
EXCEPTION 
WHEN OTHERS THEN
RETURN O;
return var_contain;

答案 2 :(得分:0)

CREATE OR REPLACE FUNCTION FACTORIAL(p_factorial INTEGER) 
   RETURN NUMBER
   AS var_fnumber number;
      ctr number;
      var_contain number := 1;
   BEGIN
      FOR ctr in 1..p_factorial 
        LOOP
          BEGIN
              var_contain := var_contain * ctr;
          EXCEPTION
              WHEN OTHERS THEN
              RETURN 0;
          RETURN var_contain;
          END;
        END LOOP;
RETURN var_contain;    
END; --FACTORIAL;
/

会说我找到了它。谢谢你的答案。

至于我使用varchar2的原因,我还没有最终确定它。