[oracle]pl/sql,oracleplsql
这句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
本文出自 “orangleliu笔记本” 博客,请务必保留此出处http://blog.csdn.net/orangleliu/article/details/38309427
不是PLSQL的问题, 是 违反了表上得唯一约束;
你要么把表上得唯一约束禁用掉,要么给自己的程序加一个 意外控制
选中表--》选中字段--》右键菜单-->drop
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。