Apache NiFi“ExecuteSQL”查询加入Oracle数据库不起作用

时间:2016-05-03 09:33:16

标签: oracle ojdbc apache-nifi

我尝试使用非常简单的SQL查询检索Oracle数据库中两个表的连接内容:

SELECT OWNER.CONTENT.ID, OWNER.CONTENT.TITLE, OWNER.BODYCONTENT.BODY
FROM OWNER.CONTENT, OWNER.BODYCONTENT
WHERE OWNER.CONTENT.ID = OWNER.BODYCONTENT.ID 
AND OWNER.CONTENT.ID < 7

使用Oracle SQL Developer运行查询。

我在NiFi中使用ojdbc7.jar驱动程序。不包含连接的更简单的SQL查询可以使用“ExecuteSQL”,例如: G。

SELECT OWNER.CONTENT.ID, OWNER.CONTENT.TITLE
FROM OWNER.CONTENT
WHERE OWNER.CONTENT.ID < 7

我还尝试过其他SQL语句(例如INNER JOIN)。查询使用Oracle SQL Developer按预期工作,但不在NiFi中工作。有人能帮助我吗?

NiFi中的错误消息:

  

2016-05-03 11:30:02,413 ERROR [定时器驱动的过程线程-6]   o.a.nifi.processors.standard.ExecuteSQL   org.apache.nifi.processor.exception.ProcessException:   java.sql.SQLFeatureNotSupportedException:不支持的功能   org.apache.nifi.processors.standard.ExecuteSQL $ 1.process(ExecuteSQL.java:160)   〜[nifi-standard-processors-0.6.1.jar:0.6.1] at   org.apache.nifi.controller.repository.StandardProcessSession.write(StandardProcessSession.java:1954)   〜[na:na] at   org.apache.nifi.processors.standard.ExecuteSQL.onTrigger(ExecuteSQL.java:152)   〜[nifi-standard-processors-0.6.1.jar:0.6.1] at   org.apache.nifi.processor.AbstractProcessor.onTrigger(AbstractProcessor.java:27)   [nifi-api-0.6.1.jar:0.6.1] at   org.apache.nifi.controller.StandardProcessorNode.onTrigger(StandardProcessorNode.java:1059)   [nifi-framework-core-0.6.1.jar:0.6.1] at   org.apache.nifi.controller.tasks.ContinuallyRunProcessorTask.call(ContinuallyRunProcessorTask.java:136)   [nifi-framework-core-0.6.1.jar:0.6.1] at   org.apache.nifi.controller.tasks.ContinuallyRunProcessorTask.call(ContinuallyRunProcessorTask.java:47)   [nifi-framework-core-0.6.1.jar:0.6.1] at   org.apache.nifi.controller.scheduling.TimerDrivenSchedulingAgent $ 1.run(TimerDrivenSchedulingAgent.java:123)   [nifi-framework-core-0.6.1.jar:0.6.1] at   java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:471)   [na:1.7.0_60] at   java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304)   [na:1.7.0_60] at   java.util.concurrent.ScheduledThreadPoolExecutor中的$ ScheduledFutureTask.access $ 301(ScheduledThreadPoolExecutor.java:178)   [na:1.7.0_60] at   java.util.concurrent.ScheduledThreadPoolExecutor中的$ ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)   [na:1.7.0_60] at   java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)   [na:1.7.0_60] at   java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:615)   [na:1.7.0_60] at java.lang.Thread.run(Thread.java:745)[na:1.7.0_60]   引起:java.sql.SQLFeatureNotSupportedException:不支持   特色在   oracle.jdbc.driver.ClobAccessor.getBytes(ClobAccessor.java:534)   〜[na:na] at   oracle.jdbc.driver.GeneratedStatement.getBytes(GeneratedStatement.java:151)   〜[na:na] at   oracle.jdbc.driver.GeneratedScrollableResultSet.getBytes(GeneratedScrollableResultSet.java:326)   〜[na:na] at   org.apache.commons.dbcp.DelegatingResultSet.getBytes(DelegatingResultSet.java:241)   〜[na:na] at   org.apache.commons.dbcp.DelegatingResultSet.getBytes(DelegatingResultSet.java:241)   〜[na:na] at   org.apache.nifi.processors.standard.util.JdbcCommon.convertToAvroStream(JdbcCommon.java:105)   〜[nifi-standard-processors-0.6.1.jar:0.6.1] at   org.apache.nifi.processors.standard.util.JdbcCommon.convertToAvroStream(JdbcCommon.java:72)   〜[nifi-standard-processors-0.6.1.jar:0.6.1] at   org.apache.nifi.processors.standard.ExecuteSQL $ 1.process(ExecuteSQL.java:158)   〜[nifi-standard-processors-0.6.1.jar:0.6.1] ... 14个常见帧   省略

1 个答案:

答案 0 :(得分:3)

看起来你的一个返回列是BINARY,VARBINARY,LONGVARBINARY,ARRAY,BLOB或CLOB,当NiFi获取此列的值时,它调用ResultSet getBytes(i)并最终调用Oracle Driver抛出不支持的异常的方法。

我创建了这个JIRA: https://issues.apache.org/jira/browse/NIFI-1841

不完全确定解决方案是什么,因为我们必须依赖JDBC接口,如果某个特定的数据库驱动程序不支持我们依赖的东西,那么我们只能这么做。