Oracle PL/SQL递归函数不返回任何值

Oracle PL/SQL递归函数不返回任何值,oracle,plsql,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 (

我在运行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;

如果
t_ic_chk=1

将递归函数的值赋回到变量:
n\u inv\u code

然而,你什么都不做。 你可能想退货

我建议您在最后一节中使用此代码:

  IF t_ic_chk = 1
  THEN
                n_inv_code := cgic(cnt);
  END IF;
  RETURN n_inv_code;
END cgic;
这就是您所需要的:

1) 如果您找到一行,则递归返回,直到找不到一行,然后返回该值。 2) 如果找不到行,请返回该值。
3) 如果您找到一行,只需将返回的值与呼叫您的人握手。

在事件
t_ic_chk=1

将递归函数的值赋回到变量:
n\u inv\u code

但是,你什么都不做。 你可能想退货

我建议您在最后一节中使用此代码:

  IF t_ic_chk = 1
  THEN
                n_inv_code := cgic(cnt);
  END IF;
  RETURN n_inv_code;
END cgic;
这就是您所需要的:

1) 如果您找到一行,则递归返回,直到找不到一行,然后返回该值。 2) 如果找不到行,请返回该值。
3) 如果您找到了一行,只需手摇动返回给呼叫您的人的值。

如果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
参数,因为除了在递归调用中传递它之外,它从未在过程中使用过


祝您好运。

如果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
参数,因为除了在递归调用中传递它之外,它从未在过程中使用过


祝你好运。

如果
t_ic_chk 1
,当rownum=1时,会发生什么情况?完整的ORA代码错误是什么?你是在编译时还是运行时得到的?ORA-06503:PL/SQL:函数返回时没有值ORA-06512:at“ESAPP.EXPORT”,第24行ORA-06512:at“ESAPP.EXPORT”,第426行ORA-06512:在第1行
当shell脚本调用调用此函数的SP时,会在运行时引发错误。第24行是SP的声明,第426行是函数调用。函数的执行路径不以
return
语句结尾。这只是函数实现中的一个bug。不幸的是,编译器不会捕捉到您的错误(至少在11gR2中),但异常仅在运行时发生。当
t_ic_chk 1
时会发生什么?rownum=1时,它不应该总是0或1吗?完整的ORA代码错误是什么,您是在编译时得到的吗,或运行时?ORA-06503:PL/SQL:函数返回时没有值ORA-06512:在“ESAPP.EXPORT”第24行ORA-06512:在“ESAPP.EXPORT”第426行ORA-06512:在第1行
当shell脚本调用调用此函数的SP时,会在运行时引发错误。第24行是SP的声明,第426行是函数调用。函数的执行路径不以
return
语句结尾。这只是函数实现中的一个bug。不幸的是,编译器不会捕捉到您的错误(至少在11gR2中),但异常只发生在运行时。谢谢。我实际上是在SP内的循环中调用此函数,并且不想在出现异常时退出。谢谢。我实际上是在SP内的循环中调用此函数,当出现异常时不想退出。哦,是的。我忘记了这里的返回部分,希望递归调用返回它。。。。太多了!哦,是的。我忘记了这里的返回部分,希望递归调用返回它。。。。太多了!