您的位置:首页 > 数据库 > Oracle

改进的Oracle分页存储过程

2009-12-07 10:26 274 查看
--Oracle分页存储过程(1)--
--定义包头部
create or replace package ZK_Pack is
type refCursorType is ref cursor; --定义游标变量用于返回记录集
procedure PageSort_proc
(p_field in varchar2, --要查询的字段
p_sql in varchar2, --表名
p_PageSize in number, --每页记录数
p_PageNo in number, --当前页码,从 1 开始
p_OutRecordCount out number, --返回总记录数
p_OutCursor out refCursorType);
end ZK_Pack;
--定义包主体
create or replace package body ZK_Pack is
procedure PageSort_proc(
p_field in varchar2, --要查询的字段
p_sql in varchar2, --表名
p_PageSize in number, --每页记录数
p_PageNo in number, --当前页码,从 1 开始
p_OutRecordCount out number, --返回总记录数
p_OutCursor out refCursorType)
as
v_sql varchar2(3000);
v_heiRownum number;
v_lowRownum number;
begin
----取记录总数
v_sql := 'select count(*) from ('|| P_sql ||')' ;
execute immediate v_sql into p_OutRecordCount;
----执行分页查询
v_heiRownum := p_PageNo * p_PageSize;
v_lowRownum := v_heiRownum - p_PageSize + 1;
--注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
--三层嵌套查询
--v_sql := 'SELECT ' || p_field || ' from (select ' || p_field || ',rownum rn FROM( ' || p_sql || ' )WHERE rownum <= '|| to_char(v_heiRownum)||')WHERE rn >= ' || to_char(v_lowRownum);
--两层嵌套查询
v_sql := 'select ' || p_field || ' from (' || P_sql || ' and rownum<='|| to_char(v_heiRownum)||') where rn>= ' || to_char(v_lowRownum);
open p_OutCursor for v_sql;
end PageSort_proc;
end ZK_Pack;

之前写的一个 和现在的这个最大的却别在于 之前的是

v_sql := 'select * from (' || Psql || ') where rn between ' || v_Pbegin || ' and ' || v_Pend;

现在的是

v_sql := 'select ' || p_field || ' from (' || P_sql || ' and rownum<='|| to_char(v_heiRownum)||') where rn>= ' || to_char(v_lowRownum);

当数据比较多得时候 select * 可能就比select id,name......要更耗资源,另外,现在采用的是三层嵌套循环效率可能比之前写的好些,期待有更优的写法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: