TIMESTAMP_FORMAT 不使用 DB2 中的 OFFSET
TIMESTAMP_FORMAT not working with OFFSET in DB2
我正在尝试在 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] Use of function TIMESTAMP_FORMAT in QSYS2 not valid."
我不确定 OFFSET 与 TIMESTAMP_FORMAT 有何关联,但是当我将 select 替换为 select * 时,它工作正常。
我想知道为什么 OFFSET 和 TIMESTAMP_FORMAT 之间有冲突,有没有办法不用子查询绕过它。
我怀疑你的问题是错误数据...
IBM 交互式工具 STRSQL 和 ACS 运行 SQL 脚本的默认设置是 OPTIMIZE(*FIRSTIO)
,这意味着尽快返回前几行...
使用 OFFSET 10
子句,您最初可能会访问以前没有访问过的行。
尝试以下方法
create table mytest as (
SELECT DATE(TIMESTAMP_FORMAT(CHAR("tablename"."date"),'YYMMDD')) as mydate
FROM tableName
) with data
如果没有错误,那么是的,你发现了一个错误,打开一个 PMR。
否则,您可以通过查看新 table 中的行并跟踪包含错误数据的记录来了解 DB 走了多远。
SQL0583
Function &1 in &2 cannot be invoked where specified because it is
defined to be not deterministic or contains an external action.
Functions that are not deterministic cannot be specified in a GROUP BY
clause or in a JOIN clause, or in the default clause for a global
variable.
Functions that are not deterministic or contain an external
action cannot be specified in a PARTITION BY clause or an ORDER BY
clause for an OLAP function and cannot be specified in the select list
of a query that contains an OFFSET clause.
The RAISE_ERROR function
cannot be specified in a GROUP BY or HAVING clause.
我不知道如何检查 QSYS2.TIMESTAMP_FORMAT
函数的这些属性(在 QSYS2.SYSROUTINES
table 中没有它的定义),但看起来不正确的定义此函数 - 没有理由将其创建为 not deterministic
或 external action
.
您可以像这样 "deceive" 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
的 "feature"...
我正在尝试在 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] Use of function TIMESTAMP_FORMAT in QSYS2 not valid."
我不确定 OFFSET 与 TIMESTAMP_FORMAT 有何关联,但是当我将 select 替换为 select * 时,它工作正常。
我想知道为什么 OFFSET 和 TIMESTAMP_FORMAT 之间有冲突,有没有办法不用子查询绕过它。
我怀疑你的问题是错误数据...
IBM 交互式工具 STRSQL 和 ACS 运行 SQL 脚本的默认设置是 OPTIMIZE(*FIRSTIO)
,这意味着尽快返回前几行...
使用 OFFSET 10
子句,您最初可能会访问以前没有访问过的行。
尝试以下方法
create table mytest as (
SELECT DATE(TIMESTAMP_FORMAT(CHAR("tablename"."date"),'YYMMDD')) as mydate
FROM tableName
) with data
如果没有错误,那么是的,你发现了一个错误,打开一个 PMR。
否则,您可以通过查看新 table 中的行并跟踪包含错误数据的记录来了解 DB 走了多远。
SQL0583
Function &1 in &2 cannot be invoked where specified because it is defined to be not deterministic or contains an external action.
Functions that are not deterministic cannot be specified in a GROUP BY clause or in a JOIN clause, or in the default clause for a global variable.
Functions that are not deterministic or contain an external action cannot be specified in a PARTITION BY clause or an ORDER BY clause for an OLAP function and cannot be specified in the select list of a query that contains an OFFSET clause.
The RAISE_ERROR function cannot be specified in a GROUP BY or HAVING clause.
我不知道如何检查 QSYS2.TIMESTAMP_FORMAT
函数的这些属性(在 QSYS2.SYSROUTINES
table 中没有它的定义),但看起来不正确的定义此函数 - 没有理由将其创建为 not deterministic
或 external action
.
您可以像这样 "deceive" 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
的 "feature"...