开发者社区 问答 正文

对于增删改频繁的表如何分页

如题,因业务需要,提出此问题,求大侠解答。

展开
收起
蛮大人123 2016-03-20 10:22:46 1896 分享 版权
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    分页跟增删改频繁又有多大关系,你需要设置个标志位,以表明每条数据的状态。

    --分页查询
    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;
    2019-07-17 19:08:50
    赞同 展开评论
问答地址: