sql - 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 之间存在冲突,有没有办法在没有子查询的情况下绕过它。
解决方案
从SQL 消息列表:
SQL0583
&2 中的函数 &1 无法在指定的地方调用,因为它被定义为不确定或包含外部操作。
不能在 GROUP BY 子句或 JOIN 子句或全局变量的默认子句中指定非确定性函数。不能在 OLAP 函数的 PARTITION BY 子句或 ORDER BY 子句中指定
不确定或包含外部操作的函数,也不能在包含 OFFSET 子句的查询的选择列表中指定。
不能在 GROUP BY 或 HAVING 子句中指定 RAISE_ERROR 函数。
我不知道如何检查QSYS2.TIMESTAMP_FORMAT
函数的这些属性(表中没有它的定义QSYS2.SYSROUTINES
),但看起来这个函数的定义不正确 - 没有理由将它创建为not deterministic
or 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
......
推荐阅读
- sql - SQL Server 配置管理器未在 Windows 10 中显示
- r - 使用命名向量改变数据框中的变量
- javascript - 编码 jquery 事件,以便该事件中的函数需要在执行 ajax 之前完成
- visual-studio - 为什么我的 .NET 5.0 应用程序会登录到 VS2019 中的“npm”控制台窗口?
- azure - 如何将 Azure Cosmos DB REST(数据平面)API 与 AAD RBAC 一起使用?
- python - 无法预测新值获取(ValueError 不兼容维度)
- excel - 复制并粘贴为负值
- google-chrome - 在浏览器扩展中实施 Google Analytics
- reactjs - 查找号码是否来自列出的任何国家 - `react-phone-number-input`
- mariadb - 为什么我必须使用 AND 而不是逗号来分隔列表中的最后一项?