UDF在group by 里出现时,报SQL0583的错

问题重现:

db2 CREATE TABLE T(SAL INTEGER)

db2 INSERT INTO T VALUES(12)
db2 INSERT INTO T VALUES(16)
db2 INSERT INTO T VALUES(20)
db2 INSERT INTO T VALUES(112)
db2 INSERT INTO T VALUES(125)
db2 INSERT INTO T VALUES(182)
db2 INSERT INTO T VALUES(120)
CREATE FUNCTION HUANGDK.money_l( V_MONEY DECIMAL(10,3) )
RETURNS INTEGER
SPECIFIC HUANGDK.money_l
------------------------------------------------------------------------
-- SQL UDF (Scalar)
------------------------------------------------------------------------
F1: BEGIN ATOMIC
RETURN
--根据输入的钱数返回费用分档
CASE WHEN V_MONEY>0 AND V_MONEY<=100 AND MOD(CAST(CEIL(V_MONEY) AS INTEGER),5)=0 THEN CAST(CEIL(V_MONEY) AS INTEGER)/5*5
WHEN V_MONEY>0 AND V_MONEY<=100 AND MOD(CAST(CEIL(V_MONEY) AS INTEGER),5)>0 THEN CAST(CEIL(V_MONEY) AS INTEGER)/5*5+5
WHEN V_MONEY>100 AND V_MONEY<=1000 AND MOD(CAST(CEIL(V_MONEY) AS INTEGER),10)=0 THEN CAST(CEIL(V_MONEY) AS INTEGER)/10*10
WHEN V_MONEY>100 AND V_MONEY<=1000 AND MOD(CAST(CEIL(V_MONEY) AS INTEGER),10)>0 THEN CAST(CEIL(V_MONEY) AS INTEGER)/10*10+10
WHEN V_MONEY>1000 AND V_MONEY<=3000 AND MOD(CAST(CEIL(V_MONEY) AS INTEGER),100)=0 THEN CAST(CEIL(V_MONEY) AS INTEGER)/100*100
WHEN V_MONEY>1000 AND V_MONEY<=3000 AND MOD(CAST(CEIL(V_MONEY) AS INTEGER),100)>0 THEN CAST(CEIL(V_MONEY) AS INTEGER)/100*100+100
ELSE -1
END ;
END
E:>db2 SELECT MONEY_L(SAL),sum(sal) FROM T GROUP BY MONEY_L(SAL)
SQL0583N 使用例程 "HUANGDK.MONEY_L"
是无效的,因为它是不确定的或具有外部操作。 SQLSTATE=42845

如何解决呢?其实很简单:


CREATE FUNCTION HUANGDK.money_l( V_MONEY DECIMAL(10,3) )
RETURNS INTEGER
SPECIFIC HUANGDK.money_l
DETERMINISTIC
NO EXTERNAL ACTION

------------------------------------------------------------------------
-- SQL UDF (Scalar)
------------------------------------------------------------------------
F1: BEGIN ATOMIC
RETURN
--根据输入的钱数返回费用分档
CASE WHEN V_MONEY>0 AND V_MONEY<=100 AND MOD(CAST(CEIL(V_MONEY) AS INTEGER),5)=0 THEN CAST(CEIL(V_MONEY) AS INTEGER)/5*5
WHEN V_MONEY>0 AND V_MONEY<=100 AND MOD(CAST(CEIL(V_MONEY) AS INTEGER),5)>0 THEN CAST(CEIL(V_MONEY) AS INTEGER)/5*5+5
WHEN V_MONEY>100 AND V_MONEY<=1000 AND MOD(CAST(CEIL(V_MONEY) AS INTEGER),10)=0 THEN CAST(CEIL(V_MONEY) AS INTEGER)/10*10
WHEN V_MONEY>100 AND V_MONEY<=1000 AND MOD(CAST(CEIL(V_MONEY) AS INTEGER),10)>0 THEN CAST(CEIL(V_MONEY) AS INTEGER)/10*10+10
WHEN V_MONEY>1000 AND V_MONEY<=3000 AND MOD(CAST(CEIL(V_MONEY) AS INTEGER),100)=0 THEN CAST(CEIL(V_MONEY) AS INTEGER)/100*100
WHEN V_MONEY>1000 AND V_MONEY<=3000 AND MOD(CAST(CEIL(V_MONEY) AS INTEGER),100)>0 THEN CAST(CEIL(V_MONEY) AS INTEGER)/100*100+100
ELSE -1
END ;
END


E:>db2 SELECT MONEY_L(SAL),sum(sal) FROM T GROUP BY MONEY_L(SAL)

1 2
----------- -----------
15 12
20 36
120 232
130 125
190 182

5 条记录已选择。


E:>

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/5718/viewspace-168283/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/5718/viewspace-168283/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值