SQLServer2008和Oracle10g分页存储过程

一、SQLServer2008

1.1分页存储过程:


-- =============================================
-- Author:  <gaga>
-- Create date: <2013-7-26>
-- Description: <分页查询的存储过程>
-- =============================================

--标量变量,表变量,本地变量
create procedure pagedByProc
@tablename varchar(20),--表名
@pageIndex int--分页
as
begin
 set nocount on
 declare @startPos int --起始点
 declare @endPos int --结束点
 declare @sum int--总的记录数
 declare @getCountDataSql nvarchar(100)--获取记录数的sql语句
 declare @tmp int --临时变量
 declare @totalPage int--总的页数
 declare @pageSize int--页面大小
 
 --拼接-获取记录数sql语句
 set @getCountDataSql = 'select @tmp = COUNT(1) from '+@tablename;
 exec sp_executesql @getCountDataSql,N'@tmp int output',@sum output 
 
 --获取总页数
 set @pageSize = 10;
 if (@sum % @pageSize = 0)
  set @totalPage = @sum / @pageSize;
 else 
  set @totalPage = @sum / @pageSize + 1;
 
 --判断索引参数是否合法
 if(@pageIndex<1)
  set @pageIndex = 1;
 if(@totalPage<@pageIndex)
  set @pageIndex = @totalPage;
 
 --初始化
 set @startPos = (@pageIndex-1)*@pageSize+1;
 set @endPos = @pageIndex*@pageSize;
 
 --执行分页语句
 exec ('select * from (select ROW_NUMBER() over(order by id) as rownum,* from '+@tablename+') t where t.rownum between '+@startPos +' and '+ @endPos);
 
end 
go

 

1.2 T-SQL测试

--建表

if OBJECT_ID('tb_user','U') is not null
 drop table tb_user;
create table tb_user(
 id  varchar(6) primary key,
 name varchar(12) not null,
 birthday datetime not null

)

--插入数据

declare @i int
set @i=10;
while @i<100
begin
insert into tb_user values('2010'+CONVERT(varchar,@i),'user'+CONVERT(varchar,@i),GETDATE());
set @i=@i+1;
end

--调用存储过程

exec pagedByProc 'tb_user', -1;

 

二、Oracle10g

2.1存储过程

/*
思路:
输入:表名,当前页数,页大小,查询条件,排序
输出:当前页,页大小,总页数,总记录数
既然要分页,必然要知道记录的起始点和结束点;
起始点和结束点是通过当前页数和页大小计算得来。
1.获取总的记录数
2.求得页数
3.验证查询条件,排序字段和排序方式以及当前页数的合法性
4.计算起始和结束点
5.动态拼接sql语句
6.execute immediate 执行sql语句
*/

--package 和 package body
--相当于java接口和实现类
--在package中定义变量类型,方法签名,函数签名部分

--定义一个包,在包中定义一个游标类型

create or replace package pkg_query as
       type cur_query is ref cursor;
end pkg_query;


create or replace procedure pagedByProc
(
       tablename in  varchar2,--表名
       condition in varchar2,--查询条件
       orderColumn in varchar2,--排序的列
       orderStyle in varchar2,--排序方式
       curPage in out int,--当前页
       pageSize in out  int,--每页的记录数
       totalPage out int,--总页数
       totalRecords out int, --总记录数
       cur_result out pkg_query.cur_query--结果集
)
is
       v_sql varchar2(20000):='';--查询语句
       v_start_position int;
       v_end_position int;
begin
       v_sql:='select count(1) from '||tablename;
       
       if condition is not null or condition <>'' then         --拼接查询条件
         v_sql := v_sql || ' where 1=1 and '||condition;
       end if;
       
       dbms_output.put_line(v_sql);
       
       execute immediate v_sql into totalRecords;            --获取总记录数

       if pageSize < 1 then                                    --验证pageSize的合法性
         pageSize := 1;
       end if;

       if mod(totalRecords,pageSize) = 0 then                --获取总页数
         totalPage := totalRecords / pageSize;
       else
         totalPage := totalRecords / pageSize + 1;
       end if;

       if curPage <1 then                                      --验证curPage的合法性
         curPage := 1;
       else if curPage >totalPage then
         curPage := totalPage;
       end if;
       end if;

       v_start_position := (curPage-1)*curPage;                 --求开始位置
       v_end_position := curPage * pageSize;                    --求结束位置

       v_sql := 'select * from (select t.*,rownum r from '||tablename||
             ' t) tt where tt.r between '||v_start_position ||' and '||v_end_position;

      if condition is not null or condition <>'' then         --拼接查询条件
         v_sql := v_sql ||' and '||condition;
      end if;

      if orderColumn is not null or orderColumn <>'' then          --排序的列
         v_sql := v_sql || ' order by ' ||orderColumn;
      end if;
      
      if orderStyle is not null or orderStyle <>'' then          --排序风格
         v_sql := v_sql || ' ' ||orderStyle;
      end if;
      
      dbms_output.put_line(v_sql);

      --execute immediate v_sql;
      open cur_result for v_sql;

end;

 

2.2 PL-SQL测试

--建表

create table tb_user(
       userId varchar2(32) default sys_guid()  primary key,
       userName varchar2(32) not null,
       pass varchar2(16) not null,
       state varchar2(10)
)

--插入数据

declare 
      i int:=1;
      begin
        for i in 1..10000 loop
          insert into tb_user(userName,pass,state) values('w'||i,'w'||i,1);
        end loop;
        commit;
      end;


declare
  v_curPage      int := 1;
  v_pageSize     int := 10;
  v_totalPage    int;
  v_totalRecords int;
  v_sys_cur      SYS_REFCURSOR;
  v_row_cur      tb_user%rowtype;
begin
  pagedByProc('tb_user',
              '',
              'userid',
              'desc',
              v_curPage,
              v_pageSize,
              totalPage    => v_totalPage,
              totalRecords => v_totalRecords,
              cur_result   => v_sys_cur);
  dbms_output.put_line(v_curPage);
  dbms_output.put_line(v_pageSize);
  dbms_output.put_line(v_totalPage);
  dbms_output.put_line(v_totalRecords);
  loop
    fetch v_sys_cur
      into v_row_cur;
   dbms_output.put_line(v_row_cur.userid);
   --dbms_output.put_line(v_row_cur.username);
  -- dbms_output.put_line(v_row_cur.pass);
  -- dbms_output.put_line(v_row_cur.state);
  -- dbms_output.put_line(v_row_cur.r);
    exit when v_sys_cur%notfound;
  end loop;
  end;

 

2.3Java连接Oracle测试


import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

import oracle.jdbc.OracleTypes;
import oracle.jdbc.driver.OracleCallableStatement;

public class PagedByProcTest {

 public static void main(String[] args) {
  
  try {
   Class.forName("oracle.jdbc.driver.OracleDriver");
   String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
   String user = "guest";
   String password = "guest";
   Connection conn = DriverManager.getConnection(url, user, password);
   String sql = "{call pagedByProc(?,?,?,?,?,?,?,?,?)}";
   CallableStatement cs = conn.prepareCall(sql);
   
   cs.setString(1, "tb_user");
   cs.setString(2, "");
   cs.setString(3, "userid");
   cs.setString(4, "desc");
   cs.setInt(5, 1);
   cs.setInt(6, 10);
   cs.registerOutParameter(5, OracleTypes.INTEGER);
   cs.registerOutParameter(6, OracleTypes.INTEGER);
   cs.registerOutParameter(7, OracleTypes.INTEGER);
   cs.registerOutParameter(8, OracleTypes.INTEGER);
   cs.registerOutParameter(9, OracleTypes.CURSOR);
   
   cs.execute();
   
   ResultSet rs = ((OracleCallableStatement)cs).getCursor(9); 
   
   while(rs.next()) 
   { 
    System.out.println(rs.getString("userid")); 
   } 
   
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  } catch (SQLException e) {
   e.printStackTrace();
  }
 }
 
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值