oracle 存储过程中自定义函数不能出现在where子句中吗?

我写了个函数addzero(abc),就是给字符串abc补零的。在存储过程中,有这句SELECTCOUNT(*)INTOvcountFROMtablettWHEREadd... 我写了个函数addzero(abc),就是给字符串abc补零的。在存储过程中,有这句
SELECT COUNT(*) INTO vcount FROM table tt WHERE addzero(tt.t)=tin;
单步调试到这句的话一直在 addzero()里面循环了,而且输入的值一直是null。
函数如下 :
CREATE OR REPLACE FUNCTION ADDzero(csm IN VARCHAR2)
RETURN tt.sm%TYPE IS
sm tt.sm%TYPE;
icount NUMBER;
i NUMBER;
BEGIN
IF csm IS NOT NULL THEN
icount := length(csm);
sm := csm;
IF icount < 11 THEN
FOR i IN 1 .. (11 - icount)
LOOP
sm := '0' || sm;
END LOOP;
END IF;
ELSE
sm := NULL;
END IF;

RETURN(sm);
END ADDzero;

求解。
展开
 我来答
Gorillatorch
2012-04-05 · TA获得超过128个赞
知道答主
回答量:90
采纳率:0%
帮助的人:62.5万
展开全部
你的目的是查询 table tt中查询t字段长度11位(不足前面添加‘0’)和输入参数tin相同的记录数。
可以考虑写成:
SELECT COUNT(*) INTO vcount FROM table tt WHERE ltrim(tt.t,'0')=ltrim(tin,'0'); --ltrim(str,'0') 却掉字符串前面的零。例如 ltrim('00050210','0') = '50210'
SELECT COUNT(*) INTO vcount FROM table tt WHERE lpad(tt.t,11,'0')=tin; --左填充11位。

调试到这句的话一直在 addzero()里面循环了的原因:
。。。
FOR i IN 1 .. (11 - icount)
LOOP
sm := '0' || sm;
END LOOP;
。。。
如果输入值是1位就循环10次,性能可想而知。调试时也一直在里面跳转。
可以写成:
sm := lpad(sm,11,'0') ; -- 不足11位用零自动填充

sm tt.sm%TYPE; --定义时的问题
用表属性虽然可以关联,但是不是什么时候都使用的,你看看后面的属性。
sm := csm; -- csm IN VARCHAR2
既然csm是字符,为什么还要这样定义?如果tt.sm是date,number型。
tt不知道是不是table name,如果是简写你应该更换,FUNCTION应该是无法识别的。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式