2012-09-16 22 views
0

我有在同一行的多個呼叫的查詢(見下面的代碼)類型4驅動程序版本 - 多SQLS(化合物SQL)

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] ERROR: 值java.sql.SQLException:[貓頭鷹] [DB2 JDBC驅動程序] [DB2]非法符號 選擇*從pk;有效的符號是開頭的語句

有誰知道爲什麼類型4驅動程序不支持上述?在聲明中是否需要使用不同的分隔符,用不同的方法使其工作?

注:該代碼在IBM Type 2 JDBC驅動程序中沒有任何問題,但在切換到Oracle的Type 4驅動程序時失敗。

我們使用weblogic作爲應用程序服務器和DB2數據庫。

+1

錯誤信息在你的問題似乎缺少,您可以編輯您的文章,將其添加在JDBC規範總是談論「一個查詢」? –

+0

'ResultSet'沒有'getMoreResults'方法,'Statement'沒有。 – Glenn

+0

謝謝Will和Glenn。請參閱最新的問題。 – user1583261

回答

2

您需要分別執行多個語句而不是複合到一個字符串中。大多數驅動程序只會允許執行一條語句。只有幾個驅動程序允許在語句/執行中執行多個語句。

通常,您不應該依賴此行爲,因爲它沒有在JDBC規範中明確定義。如果你在JDBC規範的各行之間閱讀,那麼恕我直言,在語句/執行中執行多個語句應該根本不被支持,但這是有爭議的。

爲什麼驅動程序不支持:有些數據庫系統根本不支持在一個語句/執行中準備,執行和檢索多個語句的結果。因此,爲了支持它,驅動程序實際上需要跳過各種各樣的環節才能使它工作,即使它不是JDBC的要求(或者恕我直言:不被JDBC允許)。

爲了證實我的要求,只有一個語句應該在單個語句中被執行/執行: