日期:2014-05-17 浏览次数:21022 次
select t.* from( select s.*,rownum rn from s_user s ) t where t.rn between 5 and 8
------解决方案--------------------
/* 用于分页的方法 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