现在的位置: 首页 > 综合 > 正文

数据库分页存储过程

2012年09月14日 ⁄ 综合 ⁄ 共 3068字 ⁄ 字号 评论关闭

  整理一下自己在做项目时用到的各数据库分页存储过程
   
   SQL Server2000分页存储过程:
Create procedure P_Page_Data
(
@currentpageindex int=1 ,
@pagesize int=10,
@countRecord int output
)
As
declare @currentPageSize int

DECLARE @sqlStr nvarchar(1000)

set @currentPageSize=@currentpageindex * @pagesize;
Begin

set @sqlStr='select top ' +  Convert(varchar(50),@pagesize) +  ' * from (select top ' + Convert(varchar(50),@currentPageSize) + ' * from computer order by id asc) as tableA order by id desc'

set @countrecord =(select count(id) from computer)

EXEC (@sqlStr)
End 

DECLARE @countrecord int 
 exec P_Page_Data 1,10,@countrecord OUTPUT

Sql Server2005分页存储过程:

Create procedure P_Page_Data
(
@currentpageindex int=1 ,
@pagesize int=10,
@countRecord int output
)
As
declare @currentPageSize int

DECLARE @sqlStr nvarchar(1000)

set @currentPageSize=@currentpageindex * @pagesize;
Begin

set @sqlStr='SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY id desc) AS rownum, * FROM computer ) a WHERE rownum >= ' +  Convert(varchar(50),@currentPageSize-@pagesize+1) + 'and rownum <= ' + Convert(varchar(50),@currentPageSize)

set @countrecord =(select count(id) from computer)
EXEC (@sqlStr)
End

DECLARE @countrecord int
 exec P_Page_Data 2,10,@countrecord OUTPUT

Oracle10G分页存储过程:
1.
create or replace procedure P_PagerSum(p_PageSize number,        --每页记录数
                  p_PageNo number,          --当前页码,从 1 开始
                  p_SqlSelect varchar2,  --查询语句,含排序部分
                  p_OutRecordCount out number,--返回总记录数
                  cur_OUT out GM.Pager.refCursorType)
as
    v_sql varchar2(3000);
    v_count number;
    v_heiRownum number;
    v_lowRownum number;
begin
  ----取记录总数
  v_sql := 'select count(*) from (' || p_SqlSelect || ')';
  execute immediate v_sql into v_count;
  p_OutRecordCount := v_count;
  ----执行分页查询
  v_heiRownum := p_PageNo * p_PageSize;
  v_lowRownum := v_heiRownum - p_PageSize + 1;

  v_sql := 'SELECT *
            FROM (
                  SELECT A.*, rownum rn
                  FROM  ('|| p_SqlSelect ||') A
                  WHERE rownum <= '|| to_char(v_heiRownum) || '
                 ) B
            WHERE rn >= ' || to_char(v_lowRownum) ;
            --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn

  OPEN cur_OUT FOR  v_sql;

end P_PagerSum;

2.

create or replace procedure P_PAGERSUMTEST(p_PageSize number,        --每页记录数
                  p_PageNo number,          --当前页码,从 1 开始
                  p_SqlSelectFirst varchar2, --查询语句,含排序部分
                  p_SqlSelectEnd varchar2,
                  p_OutRecordCount out number,--返回总记录数
                  cur_OUT out GM.Pager.refCursorType)
as
    v_sql varchar2(4000);
    v_count number;
    v_heiRownum number;
    v_lowRownum number;
begin
  ----取记录总数
  v_sql := 'select count(*) from (' || p_SqlSelectFirst || p_SqlSelectEnd || ')';
  execute immediate v_sql into v_count;
  p_OutRecordCount := v_count;
  ----执行分页查询
  v_heiRownum := p_PageNo * p_PageSize;
  v_lowRownum := v_heiRownum - p_PageSize + 1;

  v_sql := 'SELECT *
            FROM (
                  SELECT A.*, rownum rn
                  FROM  ('|| p_SqlSelectFirst || p_SqlSelectEnd || ') A
                  WHERE rownum <= '|| to_char(v_heiRownum) || '
                 ) B
            WHERE rn >= ' || to_char(v_lowRownum) ;
            --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn

  OPEN cur_OUT FOR  v_sql;

end P_PAGERSUMTEST;

Oracle10G的分页存储过程有两个之间的区别只是将请求的SQL语句分半,防止传递超长SQL语句(4000个字符以上时,测试时超过三千个字符都报错误)时ORACLE报错误。这个问题在项目中可苦恼了很长时间,都无法解决,最后才想到可以将SQL语句分段处理。

抱歉!评论已关闭.