如何为 DB2 表值函数传递日期参数
Posted
技术标签:
【中文标题】如何为 DB2 表值函数传递日期参数【英文标题】:How to pass date parameter for a DB2 Table valued function 【发布时间】:2020-06-26 13:21:04 【问题描述】:我是 DB2 的新手,真的希望你们中的任何一个可以帮助我。我无法使用 DATE 类型的参数创建表值函数。
我尝试了以下方法,但出现以下异常:
表值函数仅适用于 AddressCode。
我正在使用 DBeaver 在 AS400 上执行脚本。
代码:
ALTER FUNCTION ABELIBLE.TVFBOEGETSHIPMENTS (STARTDATE DATE, ENDDATE DATE, ADDRESSCODE CHAR(9))
RETURNS TABLE (ID INT, JOBNUMBER CHAR(9), CUSTOMERREFERENCE CHAR(18),
CONSIGNEENAME CHAR(30), CREATEDDATE DATE, AIRPORTOFORIGIN CHAR(3), AIRPORTOFARRIVAL CHAR(3),
AIRPORTOFDESTINATION CHAR(3), COUNTRYOFDESTINATION CHAR(3), ADDRESSCODE CHAR(9), CONSIGNMENTNUMBER CHAR(25))
LANGUAGE SQL
NOT DETERMINISTIC
READS SQL DATA
RETURN
SELECT
ROW_NUMBER() OVER(ORDER BY EMJOBN DESC),
A.EMJOBN,
A.EMCREF,
A.EMOSNM,
DATE(TIMESTAMP_FORMAT(DIGITS(A.EMCRTD), 'DDMMYY')),
A.EMAOFO,
A.EMAOFA,
A.EMAOFD,
A.EMCOFD,
A.EMUKCD,
A.EMRPRT
FROM DTALIBLE.EMASTER A WHERE A.EMPSFT = 'Y' AND A.EMUKCD = ADDRESSCODE AND
DATE(TIMESTAMP_FORMAT(DIGITS(A.EMCRTD), 'DDMMYY')) >= STARTDATE AND DATE(TIMESTAMP_FORMAT(DIGITS(A.EMCRTD), 'DDMMYY')) <= ENDDATE
【问题讨论】:
您的 Db2 数据库是否在 i 系列 (as/400) 上?还请说明您为什么使用alter function
而不是当前支持的平台允许的create or replace function
。还要说明 EMCRTD 列的 Db2-column-datatype。
@mao - 感谢您对此进行调查。您只是给了我一个想法,我尝试了以下方法。请参阅我更新的问题。干杯。
根据下面的答案,当您使用alter function
时,它需要不同的语法。当您使用create function
或create or replace function
时,您可以命名参数。您编辑的问题与原始问题不同,因此您不应在一个线程中提出两个不同的问题。此外,您应该确认您的 Db2 平台和版本(在寻求 Db2 帮助时始终这样做)。
好的,您创建了一个新问题并确认您是 AS/400,但没有提及其版本。
【参考方案1】:
我想您正在使用 DB2 for I,因为关键字 CCSID 显示在错误弹出窗口中
导致问题的不是图像中突出显示的 DATE 关键字,而是参数中的 DATE 关键字
你写的
ALTER FUNCTION ABELIBLE.TVFBOEGETSHIPMENTS (STARTDATE DATE, ENDDATE DATE, ADDRESSCODE CHAR(9))
RETURNS TABLE
你必须写
ALTER FUNCTION ABELIBLE.TVFBOEGETSHIPMENTS
/* parameter type without name that indicate the signature */
(DATE, DATE, CHAR(9))
REPLACE RESTRICT
/*redefine parameters */
(STARTDATE DATE, ENDDATE DATE, ADDRESSCODE CHAR(9))
RETURNS TABLE ...
【讨论】:
以上是关于如何为 DB2 表值函数传递日期参数的主要内容,如果未能解决你的问题,请参考以下文章
typescript:传递一个接受较少参数的函数 - 如何为传递的函数强制执行相同数量的参数