已经投票
二次开发 >> 引擎API >> 自定义函数 >> SubSection函数-Oracle查询参数个数限制

SubSection函数-Oracle查询参数个数限制

顶( )
最后更新日期: 人发表评论 (点击查看)
二次开发、自定义函数
如有一个参数查询语句:SELECT * FROM Stscore WHERE Stdno IN (${studentno}),实际情况中studenno可能是根据其他条件查询出来的结果列表,也许超过1000个学号,如最终为
SELECT * FROM Stscore WHERE Stdno IN (10001, 10002, 10003, 10004, 10005, 10006, 10007, 10008, 10009, 10010, 10011, 10012, 10013, ……,10989, 10990, 10991, 10992, 10993, 10994, 10995, 10996, 10997, 10998, 10999, 11000,11001)
直接执行上述语句,由于Oracle数据库中studentno参数的个数超过了1000个,数据库端将报ORA-01795的错误,如下图
1. 实现原理
如何解决该问题呢?此时,如果将studentno参数分割成多段,如以500为单位进行分割,将上述11001个参数值分为3部分,形成3条查询条件,便可避免该问题。
即变为SELECT * FROM Stscore WHERE Stdno IN (10001,10002,…,10500) or Stdno IN (10501,10502,…,11000) or Stdno IN (11001)
FineReport并没有实现该功能的内置函数,对于这种情况,我们可以自定义一个SubSection分组函数。
该函数的使用规则为:SubSection(para)
参数para为字符串形式,该函数的作用即将字符串参数以500为单位进行分割,并返回分割后形成的数组。
2. 实现步骤
2.1 完整代码
注:当返回有多个值,并且保存在数组中时,定义返回值的类型必须是FineReport内部的数组类型FArray,才能正确返回结果。
2.2 编译自定义函数
将编译后的SubSection.class放到FineReport的安装目录WEB-INF下面的classes目录下,因为SubSection.java属于包com.fr.demo,所以SubSection.class需要放到classes\com\fr\demo目录下。
2.3 注册并使用自定义函数
打开设计器,选择服务器|函数管理器,选择SubSection函数所在类,如下图
2.4 使用SubSection函数
如定义一个数据库查询,其中参数studentno可能有数千个参数值,此时SQL定义如下
SELECT * FROM stscore WHERE 1=1 AND studentno=0 ${joinarray(maparray(SubSection (studentno)," or StudentNo in "+item),"")}
可以看到后台打印出的sql信息:
INFO:Query SQL: SELECT * FROM stscore WHERE 1=1 AND studentno=0 or StudentNo in (1000, 1001,......, 1498, 1499) or StudentNo in ( 1500,2000, ......, 2497, 2498) or StudentNo in ( 2499, 2500, 2501, 2502, 2503, 2504, 2505)
说明:
Sql语句中
and studentno=0 //必须要有一个附加条件studentno= [数据库中肯定不存在的值] --à不取出任何值
${joinarray(maparray(SubSection (studentno)," or StudentNo in "+item),"")}
//SubSection (studentno)为以500个单位对studentno分割,返回数组
[(1000, 1001,......, 1498, 1499), ( 1500,2000, ......, 2497, 2498), ( 2499, 2500, 2501, 2502, 2503, 2504, 2505)]
Maparray(SubSection (studentno),” or StudentNo in ”) 表示对SubSection返回的数组每个元素加上“ or StudentNo in ”注意,前后都要有空格,返回新的数组
[ or StudentNo in (1000, 1001,......, 1498, 1499), or StudentNo in ( 1500,2000, ......, 2497, 2498), or StudentNo in ( 2499, 2500, 2501, 2502, 2503, 2504, 2505)]
Joinarray(array,””)返回以空号分割的字符串,即去掉上述的“[]”
or StudentNo in (1000, 1001,......, 1498, 1499), or StudentNo in ( 1500,2000, ......, 2497, 2498), or StudentNo in ( 2499, 2500, 2501, 2502, 2503, 2504, 2505)
最终SQL即为
SELECT * FROM stscore WHERE 1=1 AND studentno=0 or StudentNo in (1000, 1001,......, 1498, 1499) or StudentNo in ( 1500,2000, ......, 2497, 2498) or StudentNo in ( 2499, 2500, 2501, 2502, 2503, 2504, 2505)
因此需要加上and studentno=0否则,1=1后直接跟上or关键字会出错
 
 
 
 
   
文明发言,用心评论
 
应用此篇文章,您:
不费力
研究了一会
琢磨了好久
 
查看全部条>>
返回顶部
Copyright©2019 帆软软件有限公司
苏ICP备18065767号-3