0

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

Statement 对象由 JDBCTemplate 自动创建。

JDBCTemplate 被实例化为 new 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 Driver][DB2]ILLEGAL SYMBOL select * from a where pk ;有效的符号是声明的开始

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

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

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

4

1 回答 1

2

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

一般来说,您不应该依赖这种行为,因为它没有在 JDBC 规范中明确定义。如果您在 JDBC 规范的字里行间阅读,那么恕我直言,在 on statement/execute 中执行多个语句根本不应该得到支持,但这是值得商榷的。

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

为了证实我的主张,即在单个语句/执行中只应执行一个语句:

于 2012-09-19T12:15:47.360 回答