解决 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