使用params在DB2中创建函数时出错

时间:2015-02-27 00:06:28

标签: sql db2 sql-function

我的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'
)

为什么?

1 个答案:

答案 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只能正确处理单字符输入。)