我正在尝试在DB2中进行分页。我不想对子查询执行此操作,但是OFFSET无法与TIMESTAMP_FORMAT一起使用。
Use of function TIMESTAMP_FORMAT in QSYS2 not valid. Data mapping error on member
我找到了这个问题,但是似乎这里的问题出在列的内容上,而不是我的情况,因为值还可以,并且TIMESTAMP_FORMAT可以在没有OFFSET的情况下工作。 我并没有寻找其他不使用TIMESTAMP_FORMAT的方法,因为我需要对不是由我而是由客户端编写的查询创建分页。
查询看起来像这样。
Array
(
[0] => monday.jpg
[1] => ten-pound.jpg
[2] => hundred-fifty-pounds.jpg
)
我知道
“ [SQL0583]在QSYS2中使用功能TIMESTAMP_FORMAT无效。”
我不确定OFFSET与TIMESTAMP_FORMAT的关系如何,但是当我将select替换为select *时,效果很好。
我想知道为什么OFFSET和TIMESTAMP_FORMAT之间有冲突,并且有没有办法在没有子查询的情况下绕过它。
答案 0 :(得分:0)
我怀疑您的问题 是 数据错误...
IBM交互式工具STRSQL和ACS Run SQL脚本的默认值为OPTIMIZE(*FIRSTIO)
,这意味着尽快恢复前几行...
使用OFFSET 10
子句,您可能最初访问的是以前没有的行。
尝试以下
create table mytest as (
SELECT DATE(TIMESTAMP_FORMAT(CHAR("tablename"."date"),'YYMMDD')) as mydate
FROM tableName
) with data
如果这没有错误,那么是的,您已经找到一个错误,请打开PMR。
否则,您可以通过查看新表中的行并跟踪包含不良数据的记录来查看数据库的长度。
答案 1 :(得分:0)
SQL0583
&2中的功能&1不能在指定的地方调用,因为它是 定义为不确定的或包含外部动作。
不确定的函数不能在GROUP BY中指定 子句或JOIN子句,或全局子句的default子句 变量。
不确定的功能或包含外部功能 动作不能在PARTITION BY子句或ORDER BY中指定 OLAP函数的子句,并且不能在选择列表中指定 包含OFFSET子句的查询。
RAISE_ERROR函数 不能在GROUP BY或HAVING子句中指定。
我不知道如何检查QSYS2.TIMESTAMP_FORMAT
函数的这些属性(QSYS2.SYSROUTINES
表中没有其定义),但看起来该函数的定义不正确-没有将其创建为not deterministic
或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
...