解決 ora-01795 的問題


''' <summary>

''' 在 oracle 里 , where in 語句有可能造成問題 : ORA-01795:列表中的最大表達式數為1000

''' 如果我們在拼接where in時,其item的個數超過1000,在sql執行時會拋出ORA-01795異常。

'''  下面這個函數對原來的字符串(比如:dim str = "1,2,3,4,5,6,7,...........,1001,1002")作處理

'''     dim strCondition = getWhereIn_ora01795("ALERT_ID",str, 999) , 處理后可以直接用在oracle

'''   where ALERT_ID in (" & strCondition & ")"

''' </summary>

''' <param name="_column">元素名</param>

''' <param name="strIDs">原始字符串,比如: 0,1,2,3,4,5,6,7,8,9 </param>

''' <param name="maxNumber">每個 or in 里面最多容許的元素數量 </param>

''' <returns></returns>

''' <remarks></remarks>

PrivateFunction getWhereIn_ORA01795(_column As String, strIDs As String, maxNumber As Integer) As String

     Dim arr_IDs As String() = strIDs.Split(",") ' ID組成的 數組

     ' 假設 maxNumber 為 4

     ' 下面是轉換的樣式

     ' 0,1,2 ---> 0,1,2

     ' 0,1,2,3 ---> 0,1,2,3

      If arr_IDs.Count <= maxNumber Then' 如果元素數量小於等於最大值

         Return strIDs ' 原樣返回

      End If

 

        ' 現在知道元素數量 大於 最大值了,必須要做設置了

        Dim strSql = arr_IDs(0).Trim ' sql語句, 從第0個元素開始

       

         ' 下面是幾個轉換的樣式

         ' 0,1,2,3,4 ---> 0,1,2,3) or in (4

         ' 0,1,2,3,4,5,6,7,8,9 ---> 0,1,2,3) or in (4,5,6,7) or in (8,9

         ' 0,1,2,3,4,5,6,7,8,9,10,11 ---> 0,1,2,3) or in (4,5,6,7) or in (8,9,10,11

       For ii = 0 To arr_IDs.Count - 1 ' 對於數組中的每個元素

             If ii Mod maxNumber = 0 Then' 如果其序號 為4的倍數(0,4,8,12,。。。)

                 If ii > 0 Then' 如果其序號不是 0(其序號為 4,8,12。。。)

                     strSql &= ") or " & _column & " in (" & arr_IDs(ii).Trim

                 End If

              Else' 如果其序號 不是4的倍數(1 2 3 5 6 7 9 10 11 。。。)

                 strSql &= ", " & arr_IDs(ii).Trim

              End If

         Next

         Return strSql

End  Function


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM