代码人生的小狗窝

一行行枯燥的代码,却描绘出人生的点点滴滴

您现在的位置是:首页>_ASP.NET

关于oracle分页存储过程-在线结贴解决方法

发布时间:2019-12-10浏览(2393)

    关于oracle分页存储过程---在线结贴
    下面是一个oracle分页存储过程,执行单表分页是没什么问题,在多表进行联合查询时,当有2页数据时,第一页的最后几条会和第二页的开始几条重复;需要怎么改进,用的是rownum方式分页。
    CREATE OR REPLACE Procedure sp_page(
    i_tablename   in varchar2, --表名emp e也可以这样 emp e left join dep d on e.dep_id=d.dep_id)
    i_tablecolumn in varchar2, --查询列e.id,e.ename,e.job
    i_order       in varchar2, --排序e.ename desc
    i_pagesize    in number, --每页大小
    i_curpage     in number, --当前页
    i_where       in varchar2, --查询条件e.ename like '%S%'
    o_cur_count   out sys_refcursor, --行数和页数
    o_cur_data out sys_refcursor
    --o_cur_data    out sys_refcursor --结果集
    ) is
        v_count_sql  varchar2(2000);
        v_select_sql varchar2(2000);
        l_rowcount   integer; --总条数,输出参数
        l_pagecount  integer; --总页数
    begin
        --查询总条数
        v_count_sql := 'select count(1) from ' || i_tablename;
        --连接查询条件(''也属于is null)
        if i_where is not null then
            v_count_sql := v_count_sql || ' where ' || i_where;
        end if;
        --执行查询,查询总条数
        execute immediate v_count_sql
            into l_rowcount;

        --得到总页数
        if mod(l_rowcount, i_pagesize) = 0 then
            l_pagecount := round(l_rowcount / i_pagesize);
        else
            l_pagecount := round(l_rowcount / i_pagesize) + 1;
        end if;

        open o_cur_count for
            Select l_rowcount row_count, l_pagecount page_count from dual;

        --如果查询记录大于0则查询结果集
        if l_rowcount > 0 and i_curpage >= 1 and i_curpage <= l_pagecount then
            --查询所有(只有一页)
            if l_rowcount <= i_pagesize then
                v_select_sql := 'select ' || i_tablecolumn || ' from ' ||
                                i_tablename;
                if i_where is not null then
                    v_select_sql := v_select_sql || ' where ' || i_where;
                end if;
                if i_order is not null then
                    v_select_sql := v_select_sql || ' order by ' || i_order;