改进的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......要更耗资源,另外,现在采用的是三层嵌套循环效率可能比之前写的好些,期待有更优的写法
--定义包头部
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......要更耗资源,另外,现在采用的是三层嵌套循环效率可能比之前写的好些,期待有更优的写法
相关文章推荐
- Oracle通用分页存储过程的创建与使用
- CYQ.Data 数据框架 数据库分页方式及存储过程[SQL2000/SQL2005/Oracle]
- 使用存储过程在Oracle中来封装分页
- Oracle使用存储过程分页大数据量
- ORACLE分页的存储过程
- oracle公用分页存储过程
- Oracle万能分页法的存储过程
- oracle 分页存储过程
- CYQ.Data 数据框架 数据库分页方式及存储过程[SQL2000/SQL2005/Oracle]
- Oracle之存储过程实现分页
- Oracle 简易的分页存储过程
- Oracle使用存储过程分页
- oracle 中 Procedues (存储过程) 简单的分页。
- Oracle ——存储过程——分页
- Oracle通用分页存储过程的创建与使用
- Oracle实践--PL/SQL综合之分页存储过程
- Oracle 存储过程实现分页
- Oracle之存储过程实现分页
- 存储过程写的oracle 分页查询
- oracle中使用存储过程实现分页