--1创建一个包,在该包中,定义类型my_cursor,是个游标。
create or replace package my_package as
type my_cursor is ref cursor;
end my_package;
--2编写分页存储过程
/*
参数说明:
table_name in 表名
page_size in 每页显示记录数
page_now in 当前页
row_count out 总记录数
page_count out 总页数
rs_cursor out 返回结果集
*/
create or replace procedure pagination(
table_name in varchar2,
page_size in number,
page_now in number,
row_count out number,
page_count out number,
rs_cursor out my_package.my_cursor
) is
--变量声明部分
v_start number:=(page_now-1)*page_size+1;--分页开始数
v_end number:= page_now * page_size;--分页结束数
v_sql varchar2(200):='select ename,sal,job from (select a.*, rownum rn from
(select ename,sal,job from '||table_name||') a where rownum <= '||v_end||') b where rn >= '||v_start;
begin
--执行部分
open rs_cursor for v_sql;--分页sql
v_sql:='select count(*) from '||table_name;--统计总条数sql
execute immediate v_sql into row_count;--动态执行sql
if mod(row_count,page_size)=0 then--mod取模函数
page_count := row_count / page_size;
else
page_count := row_count / page_size +1;
end if;
end pagination;
--3调用存储过程
declare
v_table_name varchar2(20):='emp';
v_page_size number(2):=10;
v_page_now number(3):=2;
v_row_count number(3);
v_page_count number(3);
v_cursor my_package.my_cursor;
v_ename emp.ename%type;
v_sal emp.sal%type;
v_job emp.job%type;
begin
pagination(v_table_name,v_page_size,v_page_now,v_row_count,v_page_count,v_cursor);
dbms_output.put_line('总记录数:'||v_row_count||'总页数:'||v_page_count);
loop
fetch v_cursor into v_ename,v_sal,v_job;--循环获取数据
exit when v_cursor%notfound;--判断是否要退出循环
dbms_output.put_line('雇员:'||v_ename||'薪资:'||v_sal||'职位:'||v_job);
end loop;
close v_cursor;--关闭游标
end;
--1创建一个包,在该包中,定义类型my_cursor,是个游标。create or replace package my_package astype my_cursor is ref cursor;end my_package;--2编写分页存储过程/* 参数说明: table_name in 表名 page_size in 每