2009-08-29 59 views
1

如何在預處理語句中處理數組?即我想做一個查詢,我得到的一個參數是我想在查詢中使用的字符串數組(不要選擇在數組中有字段的行)?Java - 編寫語句和數組

+0

看看這個問題:http://stackoverflow.com/questions/178479/alternatives-for-java-sql-preparedstatement-in-clause-issue – ChssPly76 2009-08-29 06:18:12

回答

1

某些JDBC驅動程序可能(在JDBC 4之前)包含支持預處理語句中數組類型參數的專有擴展 - 您需要諮詢API才能實現此目的。這意味着你必須在SQL中使用和操作類似數組的類型。

一個解決方法是使用臨時表。這是元步驟,這樣的解決方案:

  1. 開始交易(如果您是內部事務 方法,這是自動的 - EJB或Spring);
  2. 使用帶準備語句的JDBC批量插入創建並填充具有arrary元素的臨時表(臨時表必須具有事務範圍 - 這也是數據庫專用的,但至少由Oracle支持);
  3. 構建您所需的SQL,其中包含與臨時表的連接以使用數組值(它可以是顯式內部或外部JOIN或隱式連接,例如使用EXISTS等);
  4. 提交(或回滾,如果應用程序異常)事務(這應該銷燬臨時表;併發事務應該對臨時表的同名沒有衝突)。

示例:將IN表達式替換爲JOIN臨時表。

+0

IBM DB2也可以做到這一點(具有事務性的臨時表範圍)。我喜歡這個想法,但與僅僅動態構建IN子句相比,有什麼好處? – 2009-08-29 07:00:06

+0

我無法證明它,但差異看起來像O(log(n))與O(n)甚至更糟。創建和填充臨時表的開銷對於較大的n(n> 5)可以忽略不計。最初我們介紹了這一點,以克服具有大量元素的IN運算符的性能問題。在添加使用法透明和簡潔的便利方法後,我們再也不會回頭再次使用IN(在元素數量不同的情況下)。 – topchef 2009-08-29 22:09:52

+0

快速性能評論:通過用臨時表代替IN,你基本上用內連接代替OR運算符。任何DBA都會同意由此帶來的性能收益是巨大的。 – topchef 2009-08-29 22:11:23

1

這可能現在不會幫你,但我讀到JDBC 4將支持在2003版SQL中定義的數組類型。