首页 > 解决方案 > TIMESTAMP_FORMAT 不适用于 DB2 中的 OFFSET

问题描述

我正在尝试在 DB2 中进行分页。我不想用子查询来做,但 OFFSET 不能用 TIMESTAMP_FORMAT。

在 QSYS2 中使用函数 TIMESTAMP_FORMAT 无效。成员数据映射错误

我找到了这个问题,但似乎问题出在列的内容上,这不是我的情况,因为值没问题,而且 TIMESTAMP_FORMAT 可以在没有 OFFSET 的情况下工作。我没有寻找其他不使用 TIMESTAMP_FORMAT 的方法,因为我需要对不是由我编写的查询创建分页,而是由客户端编写的。

查询看起来像这样。

SELECT DATE(TIMESTAMP_FORMAT(CHAR("tablename"."date"),'YYMMDD')) 
FROM tableName
OFFSET 10 ROWS

我明白了

“[SQL0583] 在 QSYS2 中使用函数 TIMESTAMP_FORMAT 无效。”

我不确定OFFSET如何与TIMESTAMP_FORMAT相关,但是当我用select *替换select时它工作正常。

我想知道为什么 OFFSET 和 TIMESTAMP_FORMAT 之间存在冲突,有没有办法在没有子查询的情况下绕过它。

标签: sqldb2db2-400

解决方案


SQL 消息列表

SQL0583
&2 中的函数 &1 无法在指定的地方调用,因为它被定义为不确定或包含外部操作
不能在 GROUP BY 子句或 JOIN 子句或全局变量的默认子句中指定非确定性函数。不能在 OLAP 函数的 PARTITION BY 子句或 ORDER BY 子句中指定
不确定或包含外部操作的函数,也不能在包含 OFFSET 子句的查询的选择列表中指定
不能在 GROUP BY 或 HAVING 子句中指定 RAISE_ERROR 函数。

我不知道如何检查QSYS2.TIMESTAMP_FORMAT函数的这些属性(表中没有它的定义QSYS2.SYSROUTINES),但看起来这个函数的定义不正确 - 没有理由将它创建为not deterministicor external action
您可以像这样“欺骗”DB2:

CREATE FUNCTION MYSCHEMA.TIMESTAMP_FORMAT(str VARCHAR(4000), fmt VARCHAR(128))
RETURNS TIMESTAMP
DETERMINISTIC
CONTAINS SQL
NO EXTERNAL ACTION
RETURN QSYS2.TIMESTAMP_FORMAT(str, fmt);

SELECT 
DATE(MYSCHEMA.TIMESTAMP_FORMAT(CHAR(tablename.date), 'YYMMDD')) 
--DATE(QSYS2.TIMESTAMP_FORMAT(CHAR(tablename.date), 'YYMMDD')) 
FROM table(values '190412') tableName(date)
OFFSET 10 ROWS;

并改用此功能。它至少适用于我的 7.3。
这是一种无害的欺骗,您可以要求 IBM 支持人员澄清QSYS2.TIMESTAMP_FORMAT......


推荐阅读