一、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,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(); } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。