PL / SQL递归函数没有返回值

时间:2016-08-23 18:39:37

标签: oracle plsql

运行Oracle PL / SQL递归函数时收到错误消息

  

函数返回没有值

任何人都知道可能是什么问题?

这是我的功能

FUNCTION cgic (cnt IN NUMBER)
   RETURN VARCHAR2
   IS
      n_inv_code   VARCHAR2 (20);
      t_ic_chk                           NUMBER;
   BEGIN
                  SELECT DBMS_RANDOM.STRING ('X', 10)
      INTO n_inv_code
      FROM DUAL;

                  select count(*) into t_ic_chk from inv_code where inv_code = n_inv_code and rownum = 1;

      IF t_ic_chk = 1
      THEN
                    n_inv_code := cgic(cnt);
      ELSE
                    IF t_ic_chk = 0
                                THEN
                      RETURN n_inv_code;
                                END IF;
      END IF;
   END cgic;

2 个答案:

答案 0 :(得分:3)

事件t_ic_chk = 1

将递归函数的值赋给变量:n_inv_code

但是,你不做任何事情。 你可能想要归还它。

我会在最后一节推荐这段代码:

  IF t_ic_chk = 1
  THEN
                n_inv_code := cgic(cnt);
  END IF;
  RETURN n_inv_code;
END cgic;

这就是你所需要的:

1)如果找到一行,请重新递归,直到找不到,然后返回该值。 2)如果找不到行,则返回该值。 3)如果你发现了一排,只需用手甩掉返回给你的人。

答案 1 :(得分:0)

IF t_ic_chk = 1开头的代码可能会替换为

CASE t_ic_chk
  WHEN 0 THEN RETURN n_inv_code;
  WHEN 1 THEN RETURN cgic(cnt);
  ELSE RAISE_APPLICATION_ERROR(-20202, 'Unexpected t_ic_chk value=' || t_ic_chk);
END;

通过这种方式,您的函数将返回预期值,或者如果它不知道如何处理它在t_ic_chk中找到的值,则会引发异常。

我确实想知道你为什么要传递cnt参数,因为它在程序中从未使用过,除非在递归调用中传递它。

祝你好运。