日期:2014-05-17  浏览次数:20949 次

oralce中,写个简单的分页的sql,在线等
有个user表
mysql这样查,用来分页,5 8是传入的参数
select * from user limit 5,8;

这个sql,在oracle中怎么写呢


------解决方案--------------------
SQL code

select t.*
from(
select s.*,rownum rn
from s_user s ) t
where t.rn between 5 and 8

------解决方案--------------------
探讨

SQL code

select t.*
from(
select s.*,rownum rn
from s_user s ) t
where t.rn between 5 and 8

------解决方案--------------------
SQL code
/*
      用于分页的方法 
      TABLE_NAME_IN                  表名(只支持单表,多表时请用视图封装)
      SQL_WHERE                      条件语句 例如 : where n_xh < 200
      SQL_ORDERBY             order by 语句 例如 : order by n_xh desc
      IDX_PAGE_IN                    请求的页数
      CURR_PAGE_COUNT_IN             每页的行数
      return 结果集动态游标  包含表或者视图中的所有字段 加上下列5个字段
             行序号           PROW            
             当前页数         dqys 没有数据时 为 0 
             总页数           zys  没有数据时 为 0
             每页个数         mygs 没有数据时 为 0
             总个数           zgs  没有数据时 为 0
    */
    FUNCTION CURRENT_PAGE(TABLE_NAME_IN      IN VARCHAR2,
                          SQL_WHERE          IN VARCHAR2,
                          SQL_ORDERBY        IN VARCHAR2,
                          IDX_PAGE_IN        NUMBER,
                          CURR_PAGE_COUNT_IN NUMBER) RETURN SYS_REFCURSOR IS
      CURR_ORDERBY_V          VARCHAR2 (2000) ;          --动态SQL的orderby条件语句
      CURR_SQL_V              VARCHAR2 (20000) ;         --分页语句动态SQL
      CURR_COUNT_SQL_V        VARCHAR2 (20000) ;         --封装了查询数量SQL
      CURR_NONEDATA_SQL_V     VARCHAR2 (2000) := 'SELECT  0 AS DQYS , 0 AS ZYS , 0 AS MYGS , 0 AS ZGS FROM DUAL ';  --没有数据时返回结果集的SQL
      PAGE_NOW_N              NUMBER ;                   --当前页数
      PAGE_SUM_N              NUMBER ;                   --总页数
      PAGE_DATA_EVERYCOUNT_N  NUMBER ;                   --每页个数
      PAGE_DATA_SUM_COUNT_N   NUMBER ;                   --总个数
      MIN_IDX_N               NUMBER ;                   --最小开始序号
      RS_REFCUR               SYS_REFCURSOR ;            --结果集返回游标
      
    BEGIN
      CURR_COUNT_SQL_V := 'SELECT COUNT(*) AS GS FROM '||TABLE_NAME_IN||' TT '||SQL_WHERE ;
      BEGIN
        EXECUTE IMMEDIATE CURR_COUNT_SQL_V INTO PAGE_DATA_SUM_COUNT_N ;  --得到总个数
      EXCEPTION              --表或视图不存在错误截获
          WHEN OTHERS THEN
        PAGE_DATA_SUM_COUNT_N := 0 ;
      END ;
      IF PAGE_DATA_SUM_COUNT_N = 0 THEN 
        CURR_SQL_V := CURR_NONEDATA_SQL_V ;
      ELSE
        
        IF SQL_ORDERBY IS NOT NULL THEN
          CURR_ORDERBY_V := SQL_ORDERBY || ', ROWID DESC ' ;                  --ORDER BY 后面加上rowid排序,防止分页语句bug
        END IF ;
        IF CURR_PAGE_COUNT_IN IS NULL OR CURR_PAGE_COUNT_IN = 0 THEN
          PAGE_DATA_EVERYCOUNT_N := 20 ;                                      --默认为每页20条
        ELSE
          PAGE_DATA_EVERYCOUNT_N := CURR_PAGE_COUNT_IN ;
        END IF ;
        
        PAGE_SUM_N := FLOOR (PAGE_DATA_SUM_COUNT_N/PAGE_DATA_EVERYCOUNT_N) ;  --小数点截掉
        IF PAGE_DATA_SUM_COUNT_N MOD PAGE_DATA_EVERYCOUNT_N <> 0 THEN         --判断总数和页面个数是否可以整除,如果不可以整除则总页数加1
          PAGE_SUM_N := PAGE_SUM_N +1 ;
        END IF ;
        PAGE_NOW_N := NVL(IDX_PAGE_IN,1) ;                     --当前页码
        IF PAGE_NOW_N > PAGE_SUM_N THEN                        --如果当前页数大于总页数  那么使当前页数等于总页数
          PAGE_NOW_N := PAGE_SUM_N ;
        END IF ;
        MIN_IDX_N := (PAGE_NOW_N - 1)*PAGE_DATA_EVERYCOUNT_N ; --结果集最小开始rownum
        --封装语句
        CURR_SQL_V := 'SELECT  '||PAGE_NOW_N||' AS DQYS , '||PAGE_SUM_N||' AS ZYS , '||PAGE_DATA_EVERYCOUNT_N||' AS MYGS , '||PAGE_DATA_SUM_COUNT_N||' AS ZGS , FYB.* 
                         FROM 
                         (
                           SELECT ROWNUM AS PROW , TTT.* FROM