create or replace package body pack_page--子程序包
is
procedure proc_pageFull--分页的存储过程声明
(p_tableName varchar2,--表名
p_pageIndex number,--当前页
p_pageSize number,--每页记录数
p_pageCount out number,--总页数
p_totalCount out number,--总记录数
v_cursor out pack_page.page_cursor,--返回的结果集
p_where varchar2,--查询条件
p_order_key varchar2,--排序关键字(asc,desc)
p_order_column varchar2)--排序字段
is
v_pageIndex number;
v_pageSize number;
v_startCurs number;
v_endCurs number;
v_sql varchar2(2000);
begin
v_sql:='select count(*) from'||p_tableName;--||'where 1=1';
if p_where is not null or p_where <>'' then
v_sql:=v_sql||' where '||p_where;
end if;
execute immediate v_sql into p_totalCount;--查询总记录数
p_pageCount=ceif(p_totalCount/p_pageSize);--计算总页数
v_pageSize:=p_pageSize;
if v_pageSize<0 then
v_pageSize:=0;
end if;
v_pageIndex:=p_pageIndex;
if v_pageIndex<0 then
v_pageIndex:=1;
end if;
v_startCurs:=(v_pageIndex-1)*v_pageSize+1;
v_endCurs:=v_pageIndex*v_pageSize;
v_sql:='select * from (select rownum num,t.* from (select *from'||p_tableName;
if p_where is not null or p_where<>'' then
v_sql:=v_sql||'where'||p_where;
end if;
if p_order_column is not null or p_order_column<>'' then
v_sql:=v_sql||') t where rownum<='||v_endCurs||') where num>='||
v_startCurs;
dbms_output.put_line(v_sql);
open v_cursor for v_sql;
end proc_pageFull;end pakc_page;
各位大哥帮我看看那里出错了吧
is
procedure proc_pageFull--分页的存储过程声明
(p_tableName varchar2,--表名
p_pageIndex number,--当前页
p_pageSize number,--每页记录数
p_pageCount out number,--总页数
p_totalCount out number,--总记录数
v_cursor out pack_page.page_cursor,--返回的结果集
p_where varchar2,--查询条件
p_order_key varchar2,--排序关键字(asc,desc)
p_order_column varchar2)--排序字段
is
v_pageIndex number;
v_pageSize number;
v_startCurs number;
v_endCurs number;
v_sql varchar2(2000);
begin
v_sql:='select count(*) from'||p_tableName;--||'where 1=1';
if p_where is not null or p_where <>'' then
v_sql:=v_sql||' where '||p_where;
end if;
execute immediate v_sql into p_totalCount;--查询总记录数
p_pageCount=ceif(p_totalCount/p_pageSize);--计算总页数
v_pageSize:=p_pageSize;
if v_pageSize<0 then
v_pageSize:=0;
end if;
v_pageIndex:=p_pageIndex;
if v_pageIndex<0 then
v_pageIndex:=1;
end if;
v_startCurs:=(v_pageIndex-1)*v_pageSize+1;
v_endCurs:=v_pageIndex*v_pageSize;
v_sql:='select * from (select rownum num,t.* from (select *from'||p_tableName;
if p_where is not null or p_where<>'' then
v_sql:=v_sql||'where'||p_where;
end if;
if p_order_column is not null or p_order_column<>'' then
v_sql:=v_sql||') t where rownum<='||v_endCurs||') where num>='||
v_startCurs;
dbms_output.put_line(v_sql);
open v_cursor for v_sql;
end proc_pageFull;end pakc_page;
各位大哥帮我看看那里出错了吧
create or replace package body pack_page--子程序包
is
procedure proc_pageFull--分页的存储过程声明
(p_tableName varchar2,--表名
p_pageIndex number,--当前页
p_pageSize number,--每页记录数
p_pageCount out number,--总页数
p_totalCount out number,--总记录数
v_cursor out pack_page.page_cursor,--返回的结果集
p_where varchar2,--查询条件
p_order_key varchar2,--排序关键字(asc,desc)
p_order_column varchar2)--排序字段
is
v_pageIndex number;
v_pageSize number;
v_startCurs number;
v_endCurs number;
v_sql varchar2(2000);
begin
v_sql:='select count(*) from'||p_tableName;--||'where 1=1';
if p_where is not null or p_where <>'' then
v_sql:=v_sql||' where '||p_where;
end if;
execute immediate v_sql into p_totalCount;--查询总记录数
p_pageCount=ceif(p_totalCount/p_pageSize);--计算总页数
v_pageSize:=p_pageSize;
if v_pageSize<0 then
v_pageSize:=0;
end if;
v_pageIndex:=p_pageIndex;
if v_pageIndex<0 then
v_pageIndex:=1;
end if;
v_startCurs:=(v_pageIndex-1)*v_pageSize+1;
v_endCurs:=v_pageIndex*v_pageSize;
v_sql:='select * from (select rownum num,t.* from (select *from'||p_tableName;
if p_where is not null or p_where<>'' then
v_sql:=v_sql||'where'||p_where;
end if;
if p_order_column is not null or p_order_column<>'' then
v_sql:=v_sql||') t where rownum<='||v_endCurs||') where num>='||v_startCurs;
end if;--这里少了一个end if结束标志
dbms_output.put_line(v_sql);
open v_cursor for v_sql;
end proc_pageFull;
end pakc_page;
CREATE OR REPLACE PACKAGE BODY pack_page --子程序包
IS
CREATE OR REPLACE PROCEDURE proc_pageFull --分页的存储过程声明
(p_tableName VARCHAR2, --表名
p_pageIndex NUMBER, --当前页
p_pageSize NUMBER, --每页记录数
p_pageCount OUT NUMBER, --总页数
p_totalCount OUT NUMBER, --总记录数
v_cursor OUT SYS_REFCURSOR, --返回的结果集
p_where VARCHAR2, --查询条件
p_order_key VARCHAR2, --排序关键字(asc,desc)
p_order_column VARCHAR2) --排序字段
IS v_pageIndex NUMBER;
v_pageSize NUMBER;
v_startCurs NUMBER;
v_endCurs NUMBER;
v_sql VARCHAR2(2000);
BEGIN
v_sql := 'select count(*) from' || p_tableName; --||'where 1=1';
IF p_where IS NOT NULL OR p_where <> '' THEN
v_sql := v_sql || ' where ' || p_where;
END IF;
EXECUTE IMMEDIATE v_sql
INTO p_totalCount; --查询总记录数
p_pageCount = ceil(p_totalCount / p_pageSize); --计算总页数
v_pageSize := p_pageSize;
IF v_pageSize < 0 THEN
v_pageSize := 0;
END IF;
v_pageIndex := p_pageIndex;
IF v_pageIndex < 0 THEN
v_pageIndex := 1;
END IF;
v_startCurs := (v_pageIndex - 1) * v_pageSize + 1;
v_endCurs := v_pageIndex * v_pageSize;
v_sql := 'select * from (select rownum num,t.* from (select *from' ||
p_tableName;
IF p_where IS NOT NULL OR p_where <> '' THEN
v_sql := v_sql || 'where' || p_where;
END IF;
IF p_order_column IS NOT NULL OR p_order_column <> '' THEN
v_sql := v_sql || ') t where rownum<=' || v_endCurs || ') where num>=' ||
v_startCurs;
END IF; --少了end if
dbms_output.put_line(v_sql);
OPEN v_cursor FOR v_sql;
END proc_pageFull;
END pack_page;
不,懂;帮,顶;学,习;赚,分。
虽然这么回贴可能会被删除。
谁他妈的删除了就是个王八蛋。
强烈抗议CSDN这种即当婊子又想立贞洁牌坊的恶劣行为!!!
有本事,就封杀我!!!理由在这里:
他妈的一帮管理员有神经病啊???
http://topic.csdn.net/u/20110422/10/1a381057-7a7b-41d9-8969-ad1f5b77f24a.html?38665
最好给出完整的表结构,测试数据,计算方法和正确结果.否则耽搁的是你宝贵的时间。
如果有多表,表之间如何关联?
如何更有效地在SQL Server论坛上提问
http://topic.csdn.net/u/20100716/19/6f132f16-20e4-418c-8dee-b99d5f86d320.html?75910
[code=SQL]
/*
*作者:paddy
*功能:Oracle分页
*/
type page_cursor is ref cursor ; --定义REF游标 procedure proc_page( --分页过程
p_tableName in varchar2,--表名
p_strWhere in varchar2,--查询条件
p_orderColumn in varchar2,--排序字段
p_orderStyle in varchar2,--排序方式(asc/desc)
p_curPage in out number,--当前页码
p_pageSize in out number,--每页记录数
p_totalCounts out number,--总记录数
p_totalPages out number,--总页数
p_cursor out page_cursor--返回的结果集
);end pack_page;
/create or replace package body pack_page
is
procedure proc_page(
p_tableName in varchar2,--表名
p_strWhere in varchar2,--查询条件
p_orderColumn in varchar2,--排序字段
p_orderStyle in varchar2,--排序方式(asc/desc)
p_curPage in out number,--当前页码
p_pageSize in out number,--每页记录数
p_totalCounts out number,--总记录数
p_totalPages out number,--总页数
p_cursor out page_cursor--返回的结果集
)
/*
*作者:paddy
*功能:Oracle分页存储过程
*/
is
v_startCurs number;--游标开始
v_endCurs number;--游标结束
v_sql varchar2(2000);--保存查询SQL语句的变量
begin
v_sql:='select count(*) from '|| p_tableName;--||'where 1=1'; if p_strWhere is not null or p_strWhere <>'' then
v_sql:=v_sql||' where '||p_strWhere;
end if;
execute immediate v_sql into p_totalCounts;--查询总记录数 p_totalPages:=ceil(p_totalCounts/p_pageSize);--计算总页数 if p_pageSize<0 then
Raise_Application_Error(-20012,'pageSize can not <0 !');
end if; if p_curPage<=0 then --判断当前页是否小于等于0
p_curPage:=1;
end if; if p_curPage>p_totalPages then --判断当前页是否超过最大页
p_curPage:=p_totalPages;
end if; v_startCurs := (p_curPage-1)*p_pageSize+1;--计算游标的开始位置
v_endCurs := p_curPage*p_pageSize;--计算游标的结尾位置 v_sql:='select * from (select rownum num,t.* from (select * from '||p_tableName;--查询SQL语句的开始部分 if p_strWhere is not null or p_strWhere<>'' then --判断是否有查询的条件传进来,有则加上
v_sql:=v_sql||' where '||p_strWhere;
end if; if p_orderColumn is not null or p_orderColumn<>'' then --判断是否有排序条件传进来,有则加上
v_sql:=v_sql||' order by '||p_orderColumn||' '||p_orderStyle;
end if; v_sql:=v_sql||') t where rownum<='||v_endCurs||')where num>='||v_startCurs;--查询SQL语句的结尾部分 dbms_output.put_line(v_sql); --打印输出最终的查询SQL语句 open p_cursor for v_sql; --打开游标并动态执行v_sql exception when others then
Raise_Application_Error(-20013,'something errors we can not know in proc_page !');
end proc_page;
end pack_page;
/
--test:
declare
v_tableName varchar2(100) :='emp' ; --表名
v_strWhere varchar2(100) :='1=1';--查询条件
v_orderColumn varchar2(100) :='sal';--排序字段
v_orderStyle varchar2(100) :='desc';--排序方式(asc/desc)
v_curPage number := -1 ;--当前页码
v_pageSize number := 3 ;--每页记录数
v_totalCounts number ;--总记录数
v_totalPages number ;--总页数
v_cursor pack_page.page_cursor;--返回的结果集
begin
pack_page.proc_page(
v_tableName,
v_strWhere,
v_orderColumn,
v_orderStyle,
v_curPage,
v_pageSize,
v_totalCounts,
v_totalPages,
v_cursor) ;
Dbms_Output.put_line('curPage='||v_curPage);
Dbms_Output.put_line('pageSize='||v_pageSize);
Dbms_Output.put_line('totalCounts='||v_totalCounts);
Dbms_Output.put_line('totalPages='||v_totalPages);
end;--result:
85 PL/SQL block, executed in 0.015 sec.
select * from (select rownum num,t.* from (select * from emp where 1=1 order by sal desc) t where rownum<=3)where num>=1
curPage=1
pageSize=3
totalCounts=16
totalPages=6
Total execution time 0.015 sec.