在包中如何实现函数的递归调用??

chen_pb 2005-09-30 08:57:31
在一个包中有这样一个函数,需要递归调用:
FUNCTION GET_ITEM_CONFIG(ERRBUF OUT VARCHAR2,
RETCODE OUT NUMBER,
P_LINE_ID NUMBER,
P_PARENT_CONFIG_ID NUMBER,
P_NUMBER NUMBER) RETURN NUMBER IS
V_CONFIG_ID NUMBER;
V_HEADER_C VARCHAR2(240);
V_NUMBER NUMBER;
V_DESCRIPTION VARCHAR2(1000);
V_ERRBUF VARCHAR2(240);
V_RETCODE VARCHAR2(240);
CURSOR CUR_A IS
SELECT CONFIG_ID
FROM BF_ITEM_CONFIGS
WHERE PARENT_CONFIG_ID=P_PARENT_CONFIG_ID
AND ORDER_LINE_ID=P_LINE_ID
ORDER BY CONFIG_ID;
BEGIN
OPEN CUR_A;
LOOP
FETCH CUR_A INTO V_CONFIG_ID;
EXIT WHEN CUR_A%NOTFOUND;
IF V_CONFIG_ID<>P_PARENT_CONFIG_ID THEN
GET_ITEM_CONFIG(V_ERRBUF,
V_RETCODE,
P_LINE_ID,
V_CONFIG_ID,
P_NUMBER + 1);
ELSE
V_NUMBER:=P_NUMBER;
V_HEADER_C:='';
LOOP
EXIT WHEN V_NUMBER=0;
V_HEADER_C:=V_HEADER_C || V_SEPERATE;
V_NUMBER:=V_NUMBER - 1;
END LOOP;
SELECT ASSEMBLY_ITEM_NUMBER||' '||
COMPONENT_ITEM_NUMBER||' '||
ITEM_NUMBER||' '||
ITEM_DESCRIPTION_CN
INTO V_DESCRIPTION
FROM BF_ITEM_CONFIGS
WHERE ORDER_LINE_ID=P_LINE_ID
AND CONFIG_ID=V_CONFIG_ID
AND PARENT_CONFIG_ID=P_PARENT_CONFIG_ID;
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,TO_CHAR(P_NUMBER)||V_HEADER_C||V_DESCRIPTION);
END IF;
END LOOP;
CLOSE CUR_A;
RETURN V_CONFIG_ID;
END;
但是编译的时候报:函数GET_ITEM_CONFIG()未定义。
如何预定义函数?
这个问题如何解决呢?
谢谢!!
...全文
157 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
超叔csdn 2005-09-30
  • 打赏
  • 举报
回复
感觉楼主的程序很乱,很多地方都有问题.
递归的时候参数都没值,怎么执行啊?你还在外层用循环,是不是有那么复杂啊?
bobfang 2005-09-30
  • 打赏
  • 举报
回复
楼主在GET_ITEM_CONFIG中递归调用函数处写错了,函数是有返回值的,不能直接调用,只能定义一个变量,然后变量:=函数(...)。
超叔csdn 2005-09-30
  • 打赏
  • 举报
回复
GET_ITEM_CONFIG(V_ERRBUF,
V_RETCODE,
P_LINE_ID,
V_CONFIG_ID,
P_NUMBER + 1);
这里有点问题.P_NUMBER + 1应该用一个值来表示吧.
你先用NUM=P_NUMBER+1;
再写GET_ITEM_CONFIG(V_ERRBUF,
V_RETCODE,
P_LINE_ID,
V_CONFIG_ID,
NUM);试试?记得在前面声明这个变量!

我写了个简单的.
create or replace function dy(i in out number) return number is
n number;
begin
if i=1 then
return 1;
else
n:=i-1;
return i*dy(n);
end if;
end dy;

declare
-- Local variables here
i integer :=6;
begin
-- Test statements here
i:=dy(i);
dbms_output.put_line(i);
end;
打印出结果:720
你可以参考一下.
WangZWang 2005-09-30
  • 打赏
  • 举报
回复
调用时用execute immediate动态语句执行试试!

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧