TIMESTAMP_FORMAT在DB2中不与OFFSET一起使用

问题描述 投票:0回答:2

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

Use of function TIMESTAMP_FORMAT in QSYS2 not valid. Data mapping error on member

我发现了这个问题,但似乎这里的问题是列的内容,而不是我的情况,因为值是正常的,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 db2 db2-400
2个回答
0
投票

来自Listing of SQL Messages

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

我不知道如何检查QSYS2.TIMESTAMP_FORMAT函数的这些属性(在QSYS2.SYSROUTINES表中没有它的定义),但它看起来像这个函数的不正确定义 - 没有理由将它创建为not deterministicexternal 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的这种“特征”......


0
投票

我怀疑你的问题是坏数据......

IBM交互式工具STRSQL和ACS Run SQL Scripts的缺省值是OPTIMIZE(*FIRSTIO),意思是尽可能快地返回前几行...

使用OFFSET 10子句,您可能最初访问的是以前没有的行。

请尝试以下方法

create table mytest as (
  SELECT DATE(TIMESTAMP_FORMAT(CHAR("tablename"."date"),'YYMMDD')) as mydate
FROM tableName
) with data

如果那不是错误,那么是的,你发现了一个错误,打开了一个PMR。

否则,您可以通过查看新表中的行并使用错误数据跟踪记录来查看数据库的距离。

© www.soinside.com 2019 - 2024. All rights reserved.