如何在Kafka Connect JDBC源连接器中添加显式WHERE子句

如何在Kafka Connect JDBC源连接器中添加显式WHERE子句,jdbc,apache-kafka,db2,apache-kafka-connect,Jdbc,Apache Kafka,Db2,Apache Kafka Connect,我正在使用kafka连接从DB2到kafka主题的源数据,我正在配置sql查询以从DB2读取数据,下面是查询 SELECT SEQ_I AS error_id, TRIM(SEND_I) AS sca , to_char(CREATE_TS,'YYYY-MM-DD HH24:MI:SS.FF3') AS create_timestamp, CREATE_TS, TRIM(ERR_MSG) AS error_message , CASE substr(ERR_MSG,1,locate('-',ER

我正在使用kafka连接从DB2到kafka主题的源数据,我正在配置sql查询以从DB2读取数据,下面是查询

SELECT SEQ_I AS error_id, TRIM(SEND_I) AS sca , to_char(CREATE_TS,'YYYY-MM-DD HH24:MI:SS.FF3') AS create_timestamp, CREATE_TS, TRIM(ERR_MSG) AS error_message , CASE substr(ERR_MSG,1,locate('-',ERR_MSG)-1) WHEN 'WARNING' THEN 'W' WHEN 'SUSPENDED' THEN 'F' END ERROR_TYPE FROM INTCHG_ERROR_DIR WHERE TRAN_I ='503' AND PRCS_N = 'GLOBAL'
我正在使用设置
“timestamp.column.name”:“CREATE_TS”
这里的问题是查询中已经存在
WHERE
子句,kafka connect试图添加另一个带有timestamp列的WHERE子句,它正在创建问题,还有一个问题是如果我从sql子句中删除WHERE子句,如下图所示

SELECT SEQ_I AS error_id, TRIM(SEND_I) AS sca , to_char(CREATE_TS,'YYYY-MM-DD HH24:MI:SS.FF3') AS create_timestamp, CREATE_TS, TRIM(ERR_MSG) AS error_message , CASE substr(ERR_MSG,1,locate('-',ERR_MSG)-1) WHEN 'WARNING' THEN 'W' WHEN 'SUSPENDED' THEN 'F' END ERROR_TYPE FROM INTCHG_ERROR_DIR
然后我得到了substr的错误,如下所示

SQL Error [22011]: THE SECOND OR THIRD ARGUMENT OF THE SUBSTR OR SUBSTRING FUNCTION IS OUT OF RANGE. SQLCODE=-138, SQLSTATE=22011, DRIVER=4.19.26

有人能就这两个问题提出建议吗?我现在陷入困境。

发生这种情况是因为您试图同时使用
“模式”:“时间戳”
查询
TimestampIncrementingTableQuerier
在与
query
中现有的
WHERE
子句冲突的查询中追加一个
WHERE
子句

这一点很清楚:

查询

如果指定,则执行查询以选择新的或更新的行。使用 此设置如果要联接表,请在中选择列的子集 表或筛选器数据。如果使用,此连接器将仅复制数据 使用此查询--将禁用整个表复制。不同的 查询模式仍可用于增量更新,但为了 正确构造增量查询时,必须能够 将WHERE子句附加到此查询(即,可能不包含WHERE子句 使用)如果使用WHERE子句,它必须处理增量查询 自身


作为一种变通方法,您可以将查询修改为(取决于您使用的SQL风格)

例如,在您的情况下,查询应该是

"query":"SELECT * FROM (SELECT SEQ_I AS error_id, TRIM(SEND_I) AS sca , to_char(CREATE_TS,'YYYY-MM-DD HH24:MI:SS.FF3') AS create_timestamp, CREATE_TS, TRIM(ERR_MSG) AS error_message , CASE substr(ERR_MSG,1,locate('-',ERR_MSG)-1) WHEN 'WARNING' THEN 'W' WHEN 'SUSPENDED' THEN 'F' END ERROR_TYPE FROM INTCHG_ERROR_DIR WHERE TRAN_I ='503' AND PRCS_N = 'GLOBAL') o"
WITH a AS
   SELECT * FROM b
    WHERE ...
SELECT * FROM a
"query":"SELECT * FROM (SELECT SEQ_I AS error_id, TRIM(SEND_I) AS sca , to_char(CREATE_TS,'YYYY-MM-DD HH24:MI:SS.FF3') AS create_timestamp, CREATE_TS, TRIM(ERR_MSG) AS error_message , CASE substr(ERR_MSG,1,locate('-',ERR_MSG)-1) WHEN 'WARNING' THEN 'W' WHEN 'SUSPENDED' THEN 'F' END ERROR_TYPE FROM INTCHG_ERROR_DIR WHERE TRAN_I ='503' AND PRCS_N = 'GLOBAL') o"