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

时间:2019-06-17 10:23:41

标签: jdbc apache-kafka db2 apache-kafka-connect

我正在使用kafka connect从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'

am使用设置"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

谁能在这两个问题上都提出建议,就此困住了。

1 个答案:

答案 0 :(得分:1)

发生这种情况是因为您尝试同时使用"mode": "timestamp"queryTimestampIncrementingTableQuerierWHERE子句附加到与WHERE中现有的query子句冲突的查询中。

JDBC source connector docs很清楚:

  

query

     

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

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

SELECT * FROM ( SELECT * FROM table WHERE ...)

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"