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;
求解。 展开
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;
求解。 展开
1个回答
展开全部
你的目的是查询 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应该是无法识别的。
可以考虑写成:
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应该是无法识别的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询