FineReport 发表于 2011-9-21 16:19:35

报表制作工具中SubSection函数之Oracle查询参数个数限制


在使用报表制作工具时如有一个参数查询语句:SELECT * FROM Stscore WHEREStdno 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)直接执行上述语句,由于studentno参数的个数超过了1000个,数据库端将报ORA-01795的错误,如下图http://www.finereport.com/forumimages/e440.png
file:///C:/Users/FR/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpghttp://www.finereport.com/forumimages/e440.png报表设计时该如何解决该问题呢?此时,如果将studentno参数分割成多段,如以500为单位进行分割,将上述11001个参数值分为3部分,形成3条查询条件,便可避免该问题。   即变为SELECT * FROMStscore WHERE Stdno IN (10001,10002,…,10500) or Stdno IN (10501,10502,…,11000)or Stdno IN (11001)      FineReport并没有实现该功能的内置函数,对于这种情况,我们可以自定义一个SubSection分组函数      该函数的使用规则为:SubSection(para)参数para为字符串形式,该函数的作用即将字符串参数以500为单位进行分割,并返回分割后形成的数组。完整代码如下:http://www.finereport.com/forumimages/e441.pnghttp://www.finereport.com/forumimages/e442.pngfile:///C:/Users/FR/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpgfile:///C:/Users/FR/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpghttp://www.finereport.com/forumimages/e441.pnghttp://www.finereport.com/forumimages/e442.png编译自定义函数将编译后的SubSection.class放到FineReport的安装目录WEB-INF下面的classes目录下,因为SubSection.java属于包com.fr.demo,所以SubSection.class需要放到classes\com\fr\demo目录下。注册并使用自定义函数       注册好定义的函数后便可进行使用了,注册与使用方法在上一节简单的自定义函数中已经介绍过,在此就不详细描述了。由于实际获得的参数格式不定,可以根据具体情况在报表工具中调整java程序。文章转自:http://blog.vsharing.com/fanfanzheng/A1421549.html

页: [1]
查看完整版本: 报表制作工具中SubSection函数之Oracle查询参数个数限制