[oracle]pl/sql --分页过程demo

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

 

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

--使用分页写存储过程

--1 首先要创建一个包,定义游标类型
 
  
  
  
  
  1. create or replace package fenyepackage as  
  2. type fenye_cursor is ref cursor
  3. end fenyepackage; 
 
--2 主要的过程
 
  
  
  
  
  1. create or replace procedure fenye( 
  2. tablename in varchar2,  --表名 
  3. pagesize in number,    --每页有多大 
  4. pagenow in  number,     --当前页 
  5. myrows out number,     --总共多少记录 
  6. mypageconnt out number,   --总共多少页 
  7. l_cursor out fenyepackage.fenye_cursor --游标 
  8. is 
  9. --得到记录的开始和结束的位置 
  10. v_begin number:=(pagenow-1)*pagesize+1; 
  11. v_end number:=pagenow*pagesize; 
  12. v_sql varchar(1000); 
  13. begin 
  14. v_sql:='select bookid,bookname,pubhouse from (select t1.*,rownum rn from (select *from '||tablename||') t1 where rownum<='||v_end||')where rn >='||v_begin; 
  15. open l_cursor for v_sql; 
  16. v_sql:='select count(*) from '||tablename; 
  17. execute immediate v_sql into myrows; 
  18. if mod(myrows,pagesize)=0 then 
  19.   mypageconnt:=myrows/pagesize; 
  20. else  
  21.   mypageconnt:=myrows/pagesize+1; 
  22. end if;   
  23. --close l_cursor; 
  24. end
 
--3 使用procedure测试
 
  
  
  
  
  1. create or replace procedure fenyeceshi( 
  2. tablename in varchar2,pagesize in number,pagenow in number) is 
  3. v_myrows number; 
  4. v_mypagecount number; 
  5. v_bookid books.bookid%type; 
  6. v_bookname books.bookname%type; 
  7. v_pubhouse books.pubhouse%type; 
  8. l_cursor fenyepackage.fenye_cursor; 
  9. begin  
  10.   fenye(tablename,pagesize,pagenow,v_myrows,v_mypagecount,l_cursor); 
  11. --使用循环读出特定页的记录
  12.   loop  
  13.     fetch l_cursor into v_bookid,v_bookname,v_pubhouse; 
  14.     --not found要连在一起写 
  15.     exit when l_cursor%notfound; 
  16.     dbms_output.put_line('图书ID是:'||v_bookid||'  名称是:'||v_bookname||'  出版社是'||v_pubhouse); 
  17.   end loop; 
  18.   dbms_output.put_line('总的记录为:'||v_myrows||'条'); 
  19.   dbms_output.put_line('总的页数为:'||v_mypagecount||'页'); 
  20. end
 
  
  
  
  
  1. SQL> exec fenyeceshi('books',2,2); 
  2.   
  3. 图书ID是:3  名称是:angle  出版社是20 
  4. 图书ID是:4  名称是:anglele  出版社是10 
  5. 总的记录为:4条 
  6. 总的页数为:2页 
  7.   
  8. 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

这个问题,待后面解决?

你可能感兴趣的:(oracle,编程,存储过程,分页,plsql)