困扰偶很久的,自定义的一个function,单独执行没问题,但是放到查询语句中就...

simonezhlx 2009-06-26 04:21:55
困扰偶很久的,自定义的一个function(test(p1,p2)),单独执行没有问题
select test(p1,p2) from dual ;
,但是放到一个查询语句中
(
select col1,col2,test(p1,p2) as fun ,p1,p2 from table1
)
这个查询可能会有多行记录,起初的几行fun列是正确数据,之后的几行记录中,fun列就没有数据了,但是其它未用函数列是正常的.
而没有数据的几行记录中的p1,p2 单独去执行也是有数据的:select test(p1,p2) from dual ;

望高手解答!
...全文
53 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
simonezhlx 2009-07-06
  • 打赏
  • 举报
回复
算了,就当做是9I的BUG吧,找时间再问高手,先结了吧
simonezhlx 2009-06-30
  • 打赏
  • 举报
回复
写死参数后发现,100行后并非是函数未被调用,而似乎是没有传入参数,或是传入了无效参数;
因为尝试了直接输出传入的参数,发现没有值.
a04023129 2009-06-30
  • 打赏
  • 举报
回复

IN (
SELECT *
FROM TABLE (
CAST (HWE00080SP.FN_SPLIT (IN_TP_HWE00080_KSKIN_ARR(i).KMKCD1, ';') AS TP_HWE00080_STR_ARR
)
));
simonezhlx 2009-06-29
  • 打赏
  • 举报
回复
是否有执行行数的限制呢,看了看,所有的查询均是只查出了100行,100行后的函数就没有执行结果了,感觉像是就没有执行过
simonezhlx 2009-06-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 welyngj 的回复:]
要用连接:
for example:

select col1,col2,testp1p2 from t1 full outer join
(select test(p1,p2) testp1p2 from t1 )t2
[/Quote]
试了一下,单独把函数列做连接也成呀,还是有很多行相当于没有执行...
fosjos 2009-06-29
  • 打赏
  • 举报
回复
varchar2最大4000
sReturnValue:='';是多余的
最后把cursor的参数写死试试,不要动态传入参数

如果还是不行,可以去找一下如何用一句sql得到你要的结果(有很多人问,很多人回答)
这样问题就没有了
simonezhlx 2009-06-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 richard360347477 的回复:]
多半是你的function没有做异常处理,比如两个输入参数是否为空这些异常;
还有就是你的function 里面可能有事务性的操作
[/Quote]
1.目前看是函数就只被前100行记录调用了,后面就不在执行了,但是使用后面的参数单独执行是有数据的.
2.无事务性操作.

函数体如下:
CREATE OR REPLACE FUNCTION "PROJECTPLANACTORS"
(sProjectID in varchar2,sActionID in varchar2)
return varchar2 as
sReturnValue varchar2(32000);
sTemp varchar2(20);
cursor cu1(p1 varchar2,p2 varchar2)
is select b.USERCNAME from pdwfd17 a inner join asreg005 b on a.Actor = b.userid
where a.procaseid=p1 and a.actionid=p2;
begin
open cu1(sProjectID,sActionID);
sReturnValue:='';
loop
fetch cu1 into sTemp;
exit when cu1%notfound;
if length(sReturnValue) > 0 then
sReturnValue:= sReturnValue || ',';
end if;
sReturnValue:=sReturnValue || sTemp;
end loop;
close cu1;
return(sReturnValue);
end ProjectPlanActors;
richard360347477 2009-06-29
  • 打赏
  • 举报
回复
多半是你的function没有做异常处理,比如两个输入参数是否为空这些异常;
还有就是你的function 里面可能有事务性的操作
simonezhlx 2009-06-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fosjos 的回复:]
能否贴一下,这个函数是做什么的,参数类型有没有什么特殊的

会不会是以前我也贴过的一个bug
http://topic.csdn.net/u/20080305/14/9b30ab0a-3da2-477b-918e-e6473520d8f9.html
[/Quote]
是很像,ORACLE 的BUG,没辙了?
fosjos 2009-06-29
  • 打赏
  • 举报
回复
能否贴一下,这个函数是做什么的,参数类型有没有什么特殊的

会不会是以前我也贴过的一个bug
http://topic.csdn.net/u/20080305/14/9b30ab0a-3da2-477b-918e-e6473520d8f9.html
welyngj 2009-06-28
  • 打赏
  • 举报
回复
要用连接:
for example:

select col1,col2,testp1p2 from t1 full outer join
(select test(p1,p2) testp1p2 from t1 )t2
zm61389457 2009-06-28
  • 打赏
  • 举报
回复
我顶

17,089

社区成员

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

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