oracle函数另类应用 (使用函数分页)

renfengjun
博客专家认证
2011-05-26 09:39:27

/*
用于分页的方法
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;
...全文
93 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
renfengjun 2011-06-12
  • 打赏
  • 举报
回复
哎~兴致勃勃的破来发帖,结果都没人看.
renfengjun 2011-05-26
  • 打赏
  • 举报
回复
希望大家多给点意见,谢谢了.

1,617

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧