有个user表
mysql这样查,用来分页,5 8是传入的参数
select * from user limit 5,8;这个sql,在oracle中怎么写呢

解决方案 »

  1.   


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

  2.   

    /*
          用于分页的方法 
          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
                                 (SELECT  TT.* 
                                     FROM '||TABLE_NAME_IN||' TT '
                                           ||SQL_WHERE||' '||CURR_ORDERBY_V||'
                                 )TTT
                             )
                             FYB
                            WHERE FYB.PROW>'||MIN_IDX_N||' AND ROWNUM <='||PAGE_DATA_EVERYCOUNT_N;
          END IF ;
          OPEN RS_REFCUR FOR CURR_SQL_V ;  --打开动态游标
          RETURN RS_REFCUR ;               --返回
        END CURRENT_PAGE;
      

  3.   

    一般是这么写吧
    select * from (
    select t.*,rownum rn from table t where rownum <= 5 ) tt
    where tt.rn >= 8;
      

  4.   

    做分页 不加order by有含义么  也可以使用分析函数