天翎MyApps技术社区 - 低代码平台 | 流程管理系统 | BPM软件

 找回密码
 注册成为天翎用户
查看: 1371|回复: 9

[已解决] 请问一下关于查询的问题

[复制链接]
上海普兰金融 发表于 2013-10-30 15:57:56 | 显示全部楼层 |阅读模式
本帖最后由 echochen 于 2013-10-31 14:02 编辑

请问一下,在平台中查询有多种方式,有设计器,dql,sql以及存储过程。那么对于有几十万条记录的表进行查询时,myApps平台的分页处理是怎么做的?
1.把结果集根据SQL直接查询出来,然后对查询出来的结果集进行分页。也就是说sql语句查询出来是10万条,然后把10万条存入缓存,然后对list进行分页在页面中显示其中30条。
2.把sql加上分页条件,例如加上rownum等条件,在查询出来的结果集数量就已经分段取得了。
第一个问题请确认是以上哪种方式?
第二个问题是,设计器,dql,sql以及存储过程都是采取第一个问题中的方式吗?
请解答
echochen 发表于 2013-10-30 16:06:16 | 显示全部楼层
您好,我们平台的分页处理是采用的您说的第二种方式进行的,而且设计器,dql,sql以及存储过程也是采取第二种方式。
 楼主| 上海普兰金融 发表于 2013-10-30 16:12:11 | 显示全部楼层
设计器,dql,sql的话,你说采取第二种方式我可以理解,因为sql是写在iscript中,你们解析的时候可以动态的加入rownum这些分页的限制,但是如果是存储过程的话,你们是通过iscript直接调用存储过程然后存储过程返回一个结果集给myApps平台,在存储过程中的sql语句都没写rownum这些限制关键字,你们平台如何动态加入这些限制关键字呢?
echochen 发表于 2013-10-30 16:23:40 | 显示全部楼层
本地给您咨询研发后回复您……
 楼主| 上海普兰金融 发表于 2013-10-30 16:31:31 | 显示全部楼层
恩,好的。我可以给你描述的更加详细一点,举个具体的例子,例如如下代码:
  1.         var result = "";
  2.         var datefrom = getItemValueAsDate("_日期从");
  3.         var dateto = getItemValueAsDate("_日期到");
  4.         if (datefrom != null && dateto != null) {
  5.                 var datef = format(datefrom, "yyyy-MM-dd");
  6.                 var datet = format(dateto, "yyyy-MM-dd");
  7.                 result = "call kq_checkinout_pkg.kq_report_day(String:" + datef
  8.                                 + ",String:" + datet + ",out:package)";
  9.         } else {
  10.                 result = "call kq_checkinout_pkg.kq_report_day(String:2018-10-01,String:2018-10-10,out:package)";
  11.         }
  12.         result;
复制代码
然后在存储过程kq_report_day中有一段如下代码:
  1. procedure kq_report_day(p_date_from varchar2,
  2.                           p_date_to   varchar2,
  3.                           c_ref       out t_cursor) is
  4.   begin
  5.   
  6.     open c_ref for
  7.    
  8.       select (select u.item_姓名
  9.                 from tlk_人员信息表单 u
  10.                where u.item_员工编号 = v.item_员工编号) as item_姓名,
  11.              (select u.item_部门
  12.                 from tlk_人员信息表单 u
  13.                where u.item_员工编号 = v.item_员工编号) as item_部门,
  14.              (select u.item_干员类别
  15.                 from tlk_人员信息表单 u
  16.                where u.item_员工编号 = v.item_员工编号) as item_干员类别,
  17.              p_date_to as item_日期,
  18.              (select t1.item_早敬业
  19.                 from tlk_敬业过程表单 t1
  20.                where t1.item_员工编号 = v.item_员工编号
  21.                  and to_char(t1.item_日期, 'YYYY-MM-DD') = p_date_to) as item_早敬业,
  22.              (select t1.item_迟到
  23.                 from tlk_敬业过程表单 t1
  24.                where t1.item_员工编号 = v.item_员工编号
  25.                  and to_char(t1.item_日期, 'YYYY-MM-DD') = p_date_to) as item_迟到,
  26.              (select t1.item_晚敬业
  27.                 from tlk_敬业过程表单 t1
  28.                where t1.item_员工编号 = v.item_员工编号
  29.                  and to_char(t1.item_日期, 'YYYY-MM-DD') = p_date_to) as item_晚敬业,
  30.              (select t1.item_早退
  31.                 from tlk_敬业过程表单 t1
  32.                where t1.item_员工编号 = v.item_员工编号
  33.                  and to_char(t1.item_日期, 'YYYY-MM-DD') = p_date_to) as item_早退,
  34.              sum(nvl(v.ITEM_上午未打卡, 0)) as ITEM_上午未打卡,
  35.              sum(nvl(v.ITEM_下午未打卡, 0)) as ITEM_下午未打卡,
  36.              (select sum(nvl(tv.ITEM_出差, 0))
  37.                 from tlk_敬业过程表单 tv
  38.                where to_char(tv.item_日期, 'YYYY-MM-DD') >= p_date_from
  39.                  and to_char(tv.item_日期, 'YYYY-MM-DD') <= p_date_to
  40.                  and tv.item_员工编号 = v.item_员工编号) as ITEM_出差,
  41.              sum(nvl(v.ITEM_年休假, 0)) as ITEM_年休假,
  42.              sum(nvl(v.ITEM_事假, 0)) as ITEM_事假,
  43.              sum(nvl(v.ITEM_病假, 0)) as ITEM_病假,
  44.              sum(nvl(v.ITEM_婚假, 0)) as ITEM_婚假,
  45.              sum(nvl(v.ITEM_产前假, 0)) as ITEM_产前假,
  46.              sum(nvl(v.ITEM_产假, 0)) as ITEM_产假,
  47.              sum(nvl(v.ITEM_陪产假, 0)) as ITEM_陪产假,
  48.              sum(nvl(v.ITEM_哺乳假, 0)) as ITEM_哺乳假,
  49.              sum(nvl(v.ITEM_丧假, 0)) as ITEM_丧假,
  50.              sum(nvl(v.ITEM_是否早迟, 0)) + sum(nvl(v.ITEM_是否早退, 0)) as ITEM_早迟,
  51.              sum(decode(nvl(v.ITEM_上午扣50, 0) + nvl(v.ITEM_下午扣50, 0),
  52.                         0,
  53.                         0,
  54.                         1)) as ITEM_扣50
  55.       
  56.         from (select *
  57.                 from tlk_敬业过程表单 t
  58.                where to_char(t.item_日期, 'YYYY-MM-DD') >= p_date_from
  59.                  and to_char(t.item_日期, 'YYYY-MM-DD') <= p_date_to
  60.                  and t.item_工作日 = 'Y'
  61.                  and is_exception(t.id, p_date_to) = 1) v
  62.        group by v.item_员工编号
  63.        order by item_干员类别, item_部门;
  64.   
  65.   end kq_report_day;
复制代码
就这样返回了一个结果集。针对于这样你们分页的机制是怎样的?
kimi 发表于 2013-10-30 17:09:31 | 显示全部楼层
您好:关于存储过程的处理,您可以查看如下图的代码进行了解:
e14.jpg

e15.jpg
 楼主| 上海普兰金融 发表于 2013-10-31 11:11:20 | 显示全部楼层
还请再贴出一下源码中关于SQL处理的代码,我比较比较。谢谢
kimi 发表于 2013-10-31 11:28:00 | 显示全部楼层
本帖最后由 kimi 于 2013-10-31 11:31 编辑

您好:sql的处理代码可参考如下图:
f5.jpg

这里不同的数据库不同的实现方法
 楼主| 上海普兰金融 发表于 2013-10-31 14:00:29 | 显示全部楼层
好的,明白了。此贴可以关闭了。谢谢!
echochen 发表于 2013-10-31 14:02:04 | 显示全部楼层
嗯,本帖关闭。

本版积分规则

QQ|手机版|天翎MyApps技术社区 ( 粤ICP备11093750号 )

GMT+8, 2026-8-13 05:36

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表