如何调用采用日期参数的 DB2 AS400 表值函数

Posted

技术标签:

【中文标题】如何调用采用日期参数的 DB2 AS400 表值函数【英文标题】:How to call a DB2 AS400 table valued function which take Date parameters 【发布时间】:2020-06-26 14:02:21 【问题描述】:

我有一个表值函数如下

  CREATE 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')) >= DATE(STARTDATE) AND DATE(TIMESTAMP_FORMAT(DIGITS(A.EMCRTD), 'DDMMYY')) <= DATE(ENDDATE)

但是,当我运行以下查询时,我没有得到任何结果

  SELECT * FROM TABLE(ABELIBLE.TVFBOEGETSHIPMENTS(DATE('06/06/2019'), DATE('06/07/2020'),'MUL0044')) AS XXX

我正在使用 DBeaver 在 AS400 上运行查询。

为了我自己的理智,我厌倦了带有文字的 select 语句,我得到了以下结果

然后,当我尝试使用以下日期时,它没有获取任何结果并且我收到此错误。

非常感谢任何帮助。提前谢谢你。

【问题讨论】:

如果您运行与函数的 SELECT 语句中相同的查询,使用提供给函数的文字值(带有 ISO 格式的日期),结果是什么 我很好奇这个问题和C#的关系 你使用的格式是 mm/dd/yyyy 不是 dd/mm/yyyy 用values to_char('06/07/2020', 'dd month yyyy'), to_char('06.07.2020', 'dd month yyyy')看区别 或者学习在你的日期文字中使用 ISO 格式以及为什么这很重要。 【参考方案1】:

唯一让我印象深刻的是在你的调用中,

SELECT * FROM TABLE(ABELIBLE.TVFBOEGETSHIPMENTS(DATE('06/06/2019'), DATE('06/07/2020'),'MUL0044')) AS XXX

'MUL0044' 作为文字被视为 varchar,而您的 UDTF 将 parm 定义为 char。

然而,这种不匹配通常会产生 Function not found 错误。您可以将文字转换为 char 或将 parm 类型更改为 varchar。选择哪个取决于通常如何调用它。如果您只是使用文字进行测试,并且函数通常会传递一个 char,那么只需将文字转换为 char。

如果您使用 IBM ACS 的 Run SQL Scripts 组件,您将能够调试该函数。

【讨论】:

以上是关于如何调用采用日期参数的 DB2 AS400 表值函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 DB2 AS/400 中将十进制字段转换为日期字段?

通过 JBDC 获取在 IBM DB2 V6R1 (AS400) 上插入的行数

我需要从Oracle Apex连接到DB2 AS / 400数据库。

DB2 AS400 Java 函数总是返回相同的值

连接到 db2 7.1 as400 的 jdbc 驱动程序

IBM iSeries / AS 400中的DB2连接字符串