2008-11-19 71 views
5

我想知道是否有一種方法將ArrayList(或任何類型的List,就此而言)綁定到最終將用於訪問Oracle數據庫的PreparedStatement。我發現:如何將ArrayList綁定到Oracle中的PreparedStatement?

PreparedStatement IN clause alternatives?

這似乎類似於我的問題,但這個問題更具體:我想一個ArrayList綁定到一個PreparedStatement在Oracle中使用,如果可能的話,怎麼樣這是否完成?

+0

在什麼能力?你的聲明(帶有佔位符)是什麼樣的?我懷疑這是一個通用的解決方案,因爲1)List的長度會有所不同,2)您聲明中佔位符的數量可能不會。另外,並非所有的列表都是訂購的。 – 2008-11-19 20:38:49

+0

Matt,所有實現了java.util.List的對象都提供了一個get(int)操作,用於檢索指定索引處的對象。它還提供了一個迭代器。這兩個都是非可選的:訂單可能很奇怪,但是存在訂單。所以所有的java.util.List實現*都是*排序的... – MetroidFan2002 2009-01-10 20:07:10

+0

...並且在Java中,List通常引用java.util.List接口契約。 – MetroidFan2002 2009-01-10 20:07:40

回答

5

你不能在一份聲明列表綁定到一個參數。

生成與參數標記列表中的每個元素,例如SQL:

SELECT NAME FROM ITEM WHERE ID IN (?, ?, ?, ?) 

即使你會爲每一個查詢的新說法,我還是建議使用PreparedStatement。如果您的列表包含String實例,您將獲得必要的轉義以防止SQL注入。

但即使它是安全類型,如Integer對象,某些驅動程序或中間件可以緩存PreparedStatements,並且在請求相同表單時返回緩存實例。當然,有些測試是必要的。如果你的列表大小差異很大,你會得到很多不同的語句,而實施不佳的緩存可能沒有準備好處理這麼多。

3

你不能直接綁定它。有一種方法可以將數組作爲參數傳遞。我不知道你想在數據庫端做什麼,所以這可能對你沒有幫助。

基本上,你必須在數據庫中創建一個嵌套表類型;根據該類型構建一個Java對象,其中包含數組中的數據;並將其作爲參數傳遞。

如果創建的數據庫中的對象:

CREATE OR REPLACE TYPE my_nested_table IS TABLE OF VARCHAR2(20); 
CREATE TABLE my_table (a my_nested_table) NESTED TABLE a STORE AS my_table_a; 

然後你就可以編寫Java代碼是這樣的:

String[] insertvalues = { "a", "b", "c" }; 
PreparedStatement p = conn.prepareStatement("INSERT INTO my_table VALUES(?)"); 
ARRAY insertParameter = new ARRAY(a_desc, conn, insertvalues); 
p.setArray(1, insertParameter); 
p.execute(); 

Oracle中的結果是這樣的:

dev> select * from my_table; 

A 
-------------------------------------------------------------------------------- 
MY_NESTED_TABLE('a', 'b', 'c') 
相關問題