我在iseries / DB2中是新手。
我们使用V7R3。我们拥有每天由RPG程序生成的表作为物理文件。为了从Java访问表数据,我们使用jt400.jar jdbc驱动程序。
大多数表查询都可以正常工作,但是某些使用“ DENSE_RANK()OVER(ORDER BY)”和“ ROW_NUMBER()OVER(PARTITION BY”)的复杂查询有时会挂起并导致CPU 100%停止工作。在AS400方面可以解决此问题。
在AS400日志中,我看到:
Job 969954/QUSER/QZDASOINIT started on 02/21/19 at 09:36:46 in subsystem
QUSRWRK in QSYS. Job entered system on 02/21/19 at 09:36:46.
User USERXX from client X.X.X.X connected to server.
Use of function TIMESTAMP_FORMAT in QSYS2 not valid.
Use of function TIMESTAMP_FORMAT in QSYS2 not valid.
Data mapping error on member TABLE_NAME.
Data mapping error on member TABLE_NAME.
Data mapping error on member TABLE_NAME.
Data mapping error on member TABLE_NAME.
Value in date, time, or timestamp string not valid.
它看起来类似于Why am I getting a "[SQL0802] Data conversion of data mapping error" exception?中描述的问题 可能是与存储在DATE类型列中的无效数据有关。
在DATE列上,我看到一些记录在SQuirrel SQL Client中显示为<null>
。有趣的是,这里有两个不同的<null>
由不同的查询返回。
如果我运行
select distinct VARCHAR_FORMAT(DATE_COLUMN, 'YYYY/MM/DD') from TABLE_NAME
我明白了
0001/01/01
和
9999/12/31
这些<null>
的行。
如果我运行DATE_COLUMN为null的表中的Select *,则不会得到任何结果。因此,我不确定是哪种<null>
。
不确定这些记录是否会引起问题。
UPD:(运行时)
Select * from TABLE
我在JDBC客户端日志中看到错误:
Warning: [SQL0181] Value in date, time, or timestamp string not valid.
SQLState: 01534
ErrorCode: 181
Warning: [SQL0181] Value in date, time, or timestamp string not valid.
SQLState: 01534
ErrorCode: 181Warning: [SQL0181] Value in date, time, or timestamp string not valid.
SQLState: 01534
ErrorCode: 181
Warning: [SQL0181] Value in date, time, or timestamp string not valid.
SQLState: 01534
ErrorCode: 181
Query 1 of 1, Rows read: 100, Elapsed time (seconds) - Total: 0.252, SQL query: 0.005, Reading results: 0.247
基于https://www.consolut.com/en/s/sap-ides-access/d/s/p/40/doc/XH-SQL0181/,它在表中某处的日期应该不正确
问题是,有什么方法可以从SQL端查找和过滤具有“无效”数据(导致日志中出现上述异常)的记录?