pl/sql 分页存储过程

--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;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值