如题,因业务需要,提出此问题,求大侠解答。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
分页跟增删改频繁又有多大关系,你需要设置个标志位,以表明每条数据的状态。
--分页查询
select * from
(
select rownum rn, T.* from
(select * from emp where sal>2000 order by sal) T
where rownum<=6
)
where rn>3
--程序包-规范
create or replace package pagePack
as
type pageCursorType is ref cursor;--游标类型
procedure procPage(
tableName varchar2,--查询的表名
showField varchar2,--查询的字段,T.*表示所有
whereText varchar2,--查询的条件,不要where
orderText varchar2,--排序的字段,不要order by
pageIndex integer,--显示的页码
pageSize integer,--每页显示的记录数
pageCursor out pageCursorType,--返回的游标
counter out integer--返回的记录总数
);
end;
--程序包-主体
create or replace package body pagePack
as
procedure procPage(
tableName varchar2,--查询的表名
showField varchar2,--查询的字段,T.*表示所有
whereText varchar2,--查询的条件,不要where
orderText varchar2,--排序的字段,不要order by
pageIndex integer,--显示的页码
pageSize integer,--每页显示的记录数
pageCursor out pageCursorType,--返回的游标
counter out integer--返回的记录总数
)
as
sqlstr varchar2(400);
wText varchar2(100);
oText varchar2(100);
begin
if whereText is not null then
wText:=' where '||whereText;
end if;
if orderText is not null then
oText:=' order by '||orderText;
end if;
sqlstr:='select * from
(
select rownum rn, '||showField||' from
(select * from '||tableName||wText||oText ||' ) T
where rownum<=:1
)
where rn>:2';
dbms_output.put_line(sqlstr);
open pageCursor for sqlstr
using pageSize*pageIndex,pageSize*(pageIndex-1);
sqlstr:='select count(*) from '||tableName||wText||oText;
dbms_output.put_line(sqlstr);
execute immediate sqlstr into counter;
end;
end;
--视图
create view viewEmp
as
select * from
(
select rownum rn,emp.* from emp
)
--测试
declare
pageCursor pagePack.pageCursorType;
users viewEmp%rowtype;
counter integer;
begin
pagePack.procPage('emp','T.*','sal>2000','sal asc',2,3,pageCursor,counter);
loop
fetch pageCursor into users;
exit when pageCursor%notfound;
dbms_output.put_line(users.ename);
end loop;
close pageCursor;
dbms_output.put_line(counter);
end;