请高手给我讲解1下存储过程实现分页的逻辑思想 最好有个例子 并帮我逐句分析1下 真的非常感谢

解决方案 »

  1.   

    一般比较通用的分页写法:
    SELECT * FROM 
    ( SELECT row_.*, rownum rownum_ FROM ( //生成标准的查询语句(没有分页条件的) 
    Sql_statement 
    ) row_ WHERE rownum <=  pageSize * pageNumber ) WHERE rownum_ > pageSize * (pageNumber - 1)) 
      

  2.   


    create or replace procedure proc_paging
    (table_name in varchar2
    ,select_clause in varchar2
    ,where_clause in varchar2
    ,order_clause in varchar2
    ,start_row in number
    ,end_row in number
    ,result in out sys_refcursor
    ) as
      stmt varchar2(2000);
    begin
      stmt := 'select ' || select_clause || chr(10) ||
              'from ' || table_name || chr(10);
      if where_clause is not null then
        stmt := stmt || 'where ' || where_clause || chr(10);    
      end if;
      if order_clause is not null then
        stmt := stmt || 'order by ' || order_clause;
      end if;
      
      stmt := 'select ' || select_clause || ',rownum rn' || chr(10) ||
              'from (' || stmt || ')';
      stmt := 'select rn,' || select_clause || chr(10) ||
              'from (' || stmt || ') where rn between ' || start_row || ' and ' || end_row;
              
      dbms_output.put_line(stmt);
      
      open result for stmt;
    end;-- 測試
    variable v refcursor;
    execute proc_paging('employees', 'employee_id,first_name,salary', null, 'salary desc', 6, 10, :v);
    print v;-- 結果
            RN EMPLOYEE_ID FIRST_NAME                         SALARY
    ---------- ----------- ------------------------------ ----------
             6         147 Alberto                             12000
             7         100 Steven                              12000
             8         108 Nancy                               12000
             9         205 Shelley                             12000
            10         168 Lisa                                11500