类型4驱动程序问题 - 多个SQL(复合SQL)

时间:2012-09-16 14:42:57

标签: jdbc db2 weblogic

我在同一行中有多个调用的查询(请参阅下面的代码)

Statement对象由JDBCTemplate自动创建。

将JDBCTemplate实例化为新的JDBCTemplate(),并从weblogic服务器池中查找数据源。

A类实现了org.springframework.jdbc.core.StatementCallback {

public Object doInStatement(Statement stmt) throws Exception {

String sql = "select * from a where pk = 'test';select * from b where pk = 'test';select * from c where pk = 'test'";

Statement stmt = 

ResultSet rs = stmt.executeQuery(sql);

rs = stmt.getResultSet();
...
rs = stmt.getMoreResults();
...
rs = stmt.getMoreResults();
...

}

使用IBM的Type 2驱动程序,上面的工作非常好。我们不得不将驱动程序更改为Oracle的Type 4 JDBC驱动程序,当我们这样做时,上面就破坏了。它不再起作用,我得到以下错误:

  

[DAO.exec]错误:   java.sql.SQLException:[OWLS] [DB2 JDBC驱动程序] [DB2] ILLEGAL SYMBOL   从哪里选择* pk;有效符号至少是声明

有谁知道为什么Type 4驱动程序不支持上述内容?我需要在声明中使用不同的分隔符,以不同的方式使其工作吗?

注意:这些代码在IBM type 2 JDBC驱动程序中没有任何问题,但是当我们切换到Oracle的Type 4驱动程序时它失败了。

我们使用weblogic作为应用服务器和DB2数据库。

1 个答案:

答案 0 :(得分:2)

您需要单独执行多个语句,而不是复合到一个字符串中。大多数驱动程序只允许执行单个语句。只有少数驱动程序允许在语句/执行中执行多个语句。

通常,您不应该依赖于此行为,因为它未在JDBC规范中明确定义。如果您在JDBC规范的行之间进行读取,那么根本不应该支持在on语句/执行中执行多个语句的恕我直言,但这是有争议的。

为什么驱动程序不支持这一点:某些数据库系统根本不支持在一个语句/执行中准备,执行和检索多个语句的结果。因此,为了支持它,驱动程序实际上需要跳过所有类型的箍以使其工作,即使它不是JDBC的要求(或恕我直言:JDBC不允许)。

证实我的主张只有一个陈述应该在一个陈述/执行中执行: