Asp.net中,用Oarcle存贮过程实现,高效率翻页

其本原理:
因为GridView自带的翻页功能效率太低,因此想到自己做一个翻页功能,原理很简单,就是每次取数据时,只取出当页的数据,每次要传入检索用SQL文、当前页和明细中显示记录的行数,通过turn_page过程的加工后,得到只取当页数据的SQL文。
  1. create or replace package GP_ZhuoQiju is
  2.     /* 
  3.         翻页共通
  4.         wv_sql           -> 检索用SQL文
  5.         wn_current_page  -> 当前页
  6.         wn_detail_count  -> 明细中显示记录行数
  7.         wn_total_count   -> 记录总行数
  8.         wn_page_count    -> 总页数
  9.         wv_result_sql    -> 处理后返回的SQL文
  10.         
  11.         概要:为了大数据量翻页不至于很慢,所以每次只取得当页的记录
  12.     */
  13.     procedure turn_page(
  14.         wv_sql in varchar2,
  15.         wn_current_page in number default 1,
  16.         wn_detail_count in number default 10,
  17.         wn_total_count out number,
  18.         wn_page_count out number,
  19.         wv_result_sql out varchar2
  20.     );
  21. end GP_ZhuoQiju;
  22. /
  23. create or replace package body GP_ZhuoQiju is
  24.     /* 翻页共通 */
  25.     procedure turn_page(
  26.         wv_sql in varchar2,
  27.         wn_current_page in number default 1,
  28.         wn_detail_count in number default 10,
  29.         wn_total_count out number,
  30.         wn_page_count out number,
  31.         wv_result_sql out varchar2
  32.     ) is
  33.         -- SQL文
  34.         lv_sql varchar2(32767);
  35.         
  36.         -- 结果集的记录开始行数
  37.         ln_row_from number;
  38.         
  39.         -- 结果集的记录结束行数
  40.         ln_row_to   number;
  41.     begin
  42.         
  43.         -- 计算出总记录行数
  44.         lv_sql := 'select count(*) from ( ' || wv_sql || ' )';
  45.         execute immediate lv_sql into wn_total_count;
  46.         -- 根据当前页和明细显示的件数,算出开始数和结束数
  47.         -- 开始数的计算为:(当前页 - 1)* 明细件数 + 1
  48.         -- 结束数的计算为:开始数 + 明细件数 - 1 
  49.         ln_row_from := (wn_current_page - 1) * wn_detail_count + 1;
  50.         ln_row_to := ln_row_from + wn_detail_count -1;
  51.         -- 对原有SQL进行加工,取出rownum,用于取出一部分数据
  52.         lv_sql :=
  53.         'select *
  54.            from (select t.*, rownum as rownumber from ( || wv_sql || ' ) t)
  55.           where rownumber between || ln_row_from || ' and ' || ln_row_to;
  56.         -- 计算出总页数
  57.         wn_page_count := ceil(wn_total_count / wn_detail_count);
  58.         
  59.         -- 返回加工后的SQL文
  60.         wv_result_sql := lv_sql;
  61.     end turn_page;
  62. end GP_ZhuoQiju;
  63. /

你可能感兴趣的:(PL/SQL,asp.net,sql)