其本原理:
因为GridView自带的翻页功能效率太低,因此想到自己做一个翻页功能,原理很简单,就是每次取数据时,只取出当页的数据,每次要传入检索用SQL文、当前页和明细中显示记录的行数,通过turn_page过程的加工后,得到只取当页数据的SQL文。
因为GridView自带的翻页功能效率太低,因此想到自己做一个翻页功能,原理很简单,就是每次取数据时,只取出当页的数据,每次要传入检索用SQL文、当前页和明细中显示记录的行数,通过turn_page过程的加工后,得到只取当页数据的SQL文。
- create or replace package GP_ZhuoQiju is
- /*
- 翻页共通
- wv_sql -> 检索用SQL文
- wn_current_page -> 当前页
- wn_detail_count -> 明细中显示记录行数
- wn_total_count -> 记录总行数
- wn_page_count -> 总页数
- wv_result_sql -> 处理后返回的SQL文
- 概要:为了大数据量翻页不至于很慢,所以每次只取得当页的记录
- */
- procedure turn_page(
- wv_sql in varchar2,
- wn_current_page in number default 1,
- wn_detail_count in number default 10,
- wn_total_count out number,
- wn_page_count out number,
- wv_result_sql out varchar2
- );
- end GP_ZhuoQiju;
- /
- create or replace package body GP_ZhuoQiju is
- /* 翻页共通 */
- procedure turn_page(
- wv_sql in varchar2,
- wn_current_page in number default 1,
- wn_detail_count in number default 10,
- wn_total_count out number,
- wn_page_count out number,
- wv_result_sql out varchar2
- ) is
- -- SQL文
- lv_sql varchar2(32767);
- -- 结果集的记录开始行数
- ln_row_from number;
- -- 结果集的记录结束行数
- ln_row_to number;
- begin
- -- 计算出总记录行数
- lv_sql := 'select count(*) from ( ' || wv_sql || ' )';
- execute immediate lv_sql into wn_total_count;
- -- 根据当前页和明细显示的件数,算出开始数和结束数
- -- 开始数的计算为:(当前页 - 1)* 明细件数 + 1
- -- 结束数的计算为:开始数 + 明细件数 - 1
- ln_row_from := (wn_current_page - 1) * wn_detail_count + 1;
- ln_row_to := ln_row_from + wn_detail_count -1;
- -- 对原有SQL进行加工,取出rownum,用于取出一部分数据
- lv_sql :=
- 'select *
- from (select t.*, rownum as rownumber from ( ' || wv_sql || ' ) t)
- where rownumber between ' || ln_row_from || ' and ' || ln_row_to;
- -- 计算出总页数
- wn_page_count := ceil(wn_total_count / wn_detail_count);
- -- 返回加工后的SQL文
- wv_result_sql := lv_sql;
- end turn_page;
- end GP_ZhuoQiju;
- /