我的db2函数有问题
该函数查找记录,并根据用户记录的第一个和第二个返回一个数字
函数中的查询是
SELECT
CASE
WHEN NUM IN (1,2) THEN 5
ELSE 2.58
END AS VAL
FROM (
select ROW_NUMBER() OVER() AS NUM ,s.POLLIFE
from LQD943DTA.CAQRTRML8 c
INNER JOIN LSMODXTA.SCSRET s ON c.MCCNTR = s.POLLIFE
WHERE s.NOEMP = ( SELECT NOEMP FROM LSMODDTA.LOLLM04 WHERE POLLIFE = '0010111003')
) AS T WHERE POLLIFE = '0010111003'
完美无缺
我使用此代码
创建函数CREATE FUNCTION LIBWEB.BNOWPAPOL(POL CHAR)
RETURNS DECIMAL(7,2)
LANGUAGE SQL
NOT DETERMINISTIC
READS SQL DATA
RETURN (
SELECT
CASE
WHEN NUM IN (1,2) THEN 5
ELSE 2.58
END AS VAL
FROM (
select ROW_NUMBER() OVER() AS NUM ,s.POLLIFE
from LQD943DTA.CAQRTRML8 c
INNER JOIN LSMODXTA.SCSRET s ON c.MCCNTR = s.POLLIFE
WHERE s.NOEMP = ( SELECT NOEMP FROM LSMODDTA.LOLLM04 WHERE POLLIFE = POL)
) AS T WHERE POLLIFE = POL
)
命令正确执行
警告:17:55:40 [创建 - 0行,0.439秒]已处理命令。 没有行受影响
当我想执行查询时得到错误
SELECT LIBWEB.BNOWPAPOL('0010111003') FROM DATAS.DUMMY -- dummy has only one row
我得到了
[错误代码:-204,SQL状态:42704] [SQL0204] LIBWEB中的BNOWPAPOL 键入* N未找到。
我检测到,当我删除参数时,该功能正常工作!
使用此代码
CREATE FUNCTION LIBWEB.BNOWPAPOL()
RETURNS DECIMAL(7,2)
LANGUAGE SQL
NOT DETERMINISTIC
READS SQL DATA
RETURN (
SELECT
CASE
WHEN NUM IN (1,2) THEN 5
ELSE 2.58
END AS VAL
FROM (
select ROW_NUMBER() OVER() AS NUM ,s.POLLIFE
from LQD943DTA.CAQRTRML8 c
INNER JOIN LSMODXTA.SCSRET s ON c.MCCNTR = s.POLLIFE
WHERE s.NOEMP = ( SELECT NOEMP FROM LSMODDTA.LOLLM04 WHERE POLLIFE = '0010111003')
) AS T WHERE POLLIFE = '0010111003'
)
为什么?
答案 0 :(得分:3)
本声明:
SELECT LIBWEB.BNOWPAPOL('0010111003') FROM DATAS.DUMMY
导致此错误:
[错误代码:-204,SQL状态:42704] [SQL0204] LIBWEB中的BNOWPAPOL 键入* N未找到。
传递给BNOWPAPOL()函数的parm值作为带引号的字符串提供,没有定义(没有CAST)。 SELECT语句假定它是一个VARCHAR值,因为可以随时给出不同长度的字符串,并将其作为VARCHAR传递给服务器。
原始功能定义说:
CREATE FUNCTION LIBWEB.BNOWPAPOL(POL CHAR)
为单字节CHAR生成函数签名。 (函数定义可以重载以处理不同的输入,签名用于区分函数版本。)
由于从客户端传递了VARCHAR,并且服务器只找到了CHAR函数版本,因此返回的错误适合。将函数定义或CASTing更改为匹配类型可以解决此类问题。 (注意,如果值为CAST,则CHAR(1)parm只能正确处理单字符输入。)