''' <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