上一篇文章解决了如何使用Clickhouse-JDBC-Bridge直接从Oracle拉取数据的问题,连接如下:
Clickhouse 通过JDBC方式从Oracle抽取数据,不借助任何抽数工具。顺便聊下Airbyte_Johnwick888的博客-CSDN博客
但实际操作中发现,Oracle的DATE和TIMESTAAMP类型的字段读取过来完全不正确,不管是使用json配置还是jdbc直读的方式,比如下面的字段:
为了解决问题,用了一整天的时间探索,包括更换JDK、更换JDBC,都不好使,网上也没相关信息。无奈,最后仔细研究了下Clickhouse-jdbc-bridge在GitHub上的源码,发现是配置的问题,需要手动转换才行,具体方式就是更新json配置文件如下:
{
"$schema": "../../../../../docker/config/datasource.jschema",
"myoracle": {
"converter": {
"mappings": [{ "nativeType": "TIMESTAMP", "toType": "String" },
{ "nativeType": "DATE", "toType": "String" }]
},
"driverUrls": ["/data/clickhouse-jdbc-bridge/drivers/oracle"],
"driverClassName": "oracle.jdbc.driver.OracleDriver",
"jdbcUrl": "jdbc:oracle:thin:@localhost:1521/orclpdb1",
"username": "nanchang",
"password": "nanchang",
"connectionTestQuery":"",
"initializationFailTimeout": 0,
"minimumIdle": 0,
"maximumPoolSize": 10
}
}
如上,mapping字段就是手动转换相应的数据类型,最终完美解决。不管是直接读取还是插入到Clickhouse的表里,都能跟源数据保持一致。如下:
最后附上Oracle JDBC直读的格式,但没法解决日期问题,等我解决了再补充。慎用:
select * FROM jdbc('jdbc:oracle:thin:用户名/密码@localhost:1521/orclpdb1','模式', '表或select语句')
Oracle JDBC的完整扩展格式如下:
jdbc:oracle:thin:[user/password]@[[protocol:]//]host1[,host2,host3][:port1][,host4:port2] [/service_name][:server_mode][/instance_name][?connection properties]
可参阅如下链接: