设为首页 加入收藏

TOP

[oracle]pl/sql--分页过程demo
2015-07-24 11:49:33 来源: 作者: 【 】 浏览:4
Tags:oracle pl/sql-- 过程 demo

这句sql可以用来查询一张表中的特定位置的记录

--查询的方法获取分页的语句 
select *from  
(select t1.*,rownum rn from (select *from books) t1 where rownum<=4) 
where rn >2; 

--使用分页写存储过程

--1 首先要创建一个包,定义游标类型
create or replace package fenyepackage as  
type fenye_cursor is ref cursor; 
end fenyepackage; 

--2 主要的过程
create or replace procedure fenye( 
tablename in varchar2,  --表名 
pagesize in number,    --每页有多大 
pagenow in  number,     --当前页 
myrows out number,     --总共多少记录 
mypageconnt out number,   --总共多少页 
l_cursor out fenyepackage.fenye_cursor --游标 
) is 
--得到记录的开始和结束的位置 
v_begin number:=(pagenow-1)*pagesize+1; 
v_end number:=pagenow*pagesize; 
v_sql varchar(1000); 
begin 
v_sql:='select bookid,bookname,pubhouse from (select t1.*,rownum rn from (select *from '||tablename||') t1 where rownum<='||v_end||')where rn >='||v_begin; 
open l_cursor for v_sql; 
v_sql:='select count(*) from '||tablename; 
execute immediate v_sql into myrows; 
if mod(myrows,pagesize)=0 then 
  mypageconnt:=myrows/pagesize; 
else  
  mypageconnt:=myrows/pagesize+1; 
end if;   
--close l_cursor; 
end; 
--3 使用procedure测试
create or replace procedure fenyeceshi( 
tablename in varchar2,pagesize in number,pagenow in number) is 
v_myrows number; 
v_mypagecount number; 
v_bookid books.bookid%type; 
v_bookname books.bookname%type; 
v_pubhouse books.pubhouse%type; 
l_cursor fenyepackage.fenye_cursor; 
begin  
  fenye(tablename,pagesize,pagenow,v_myrows,v_mypagecount,l_cursor); 
--使用循环读出特定页的记录
  loop  
    fetch l_cursor into v_bookid,v_bookname,v_pubhouse; 
    --not found要连在一起写 
    exit when l_cursor%notfound; 
    dbms_output.put_line('图书ID是:'||v_bookid||'  名称是:'||v_bookname||'  出版社是'||v_pubhouse); 
  end loop; 
  dbms_output.put_line('总的记录为:'||v_myrows||'条'); 
  dbms_output.put_line('总的页数为:'||v_mypagecount||'页'); 
end; 
SQL> exec fenyeceshi('books',2,2); 
  
图书ID是:3  名称是:angle  出版社是20 
图书ID是:4  名称是:anglele  出版社是10 
总的记录为:4条 
总的页数为:2页 
  
PL/SQL procedure successfully completed 

??: 这样是能得到结果,但是主过程中对于游标是否关闭很疑惑

没有关闭的情况下是正常的,关闭了的话会出错

这个问题,待后面解决?

SQL> exec fenyeceshi('books',2,2);   begin fenyeceshi('books',2,2); end;   ORA-01001: 无效的游标 ORA-06512: 在 "SCOTT.FENYECESHI", line 12 ORA-06512: 在 line 2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇OracleRAC环境下如何更新patch(Ro.. 下一篇Oracle学习笔记16--游标(PL/SQL)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Announcing October (2025-12-24 15:18:16)
·MySQL有什么推荐的学 (2025-12-24 15:18:13)
·到底应该用MySQL还是 (2025-12-24 15:18:11)
·进入Linux世界大门的 (2025-12-24 14:51:47)
·Download Linux | Li (2025-12-24 14:51:44)