ORACLE分页查询数据存储过程

 1 CREATE OR REPLACE PACKAGE PKG_GETPAGERDATA AS
 2   TYPE refCursorType IS REF CURSOR;
 3   procedure DL_GETPAGEREDDATA(p_PageSize       int, --每页记录数
 4                               p_PageNo         int, --当前页码,从 1 开始
 5                               p_SqlSelect      varchar2, --查询语句,含排序部分
 6                               p_SqlCount       varchar2, --获取记录总数的查询语句
 7                               p_OutRecordCount out int, --返回总记录数
 8                               p_OutCursor      out refCursorType, --返回结果集
 9                               res_code         out int, --返回成功与否,0成功,1失败
10                               res_Result       out varchar2 --异常信息或需要返回的信息
11                               );
12 END;
13 
14 --PackageBody
15 create or replace package body PKG_GETPAGERDATA is
16   procedure DL_GETPAGEREDDATA --获取分页查询数据存储过程
17   (p_PageSize       int, --每页记录数
18    p_PageNo         int, --当前页码,从 1 开始
19    p_SqlSelect      varchar2, --查询语句,含排序部分
20    p_SqlCount       varchar2, --获取记录总数的查询语句
21    p_OutRecordCount out int, --返回总记录数
22    p_OutCursor      out refCursorType, --返回结果集
23    res_code         out int, --返回成功与否,0成功,1失败
24    res_Result       out varchar2 --异常信息或需要返回的信息
25    ) as
26     v_sql           varchar2(3000);
27     l_count         int; --总记录数
28     l_totalpage     int; --总页数
29     l_curpage       int; --当前页码
30     l_heiRownum     int;
31     l_lowRownum     int;
32     v_ProcedureName varchar2(100);
33   begin
34     res_code := 0;
35     --取记录总数
36     v_ProcedureName := '取记录总数';
37     execute immediate p_SqlCount
38       into l_count;
39     p_OutRecordCount := l_count;
40     l_curpage        := p_PageNo;
41   
42     l_totalpage := floor(l_count / p_PageSize);
43     if mod(l_count, p_PageSize) != 0 then
44       l_totalpage := l_totalpage + 1;
45     end if;
46   
47     if l_totalpage <= 0 then
48       l_totalpage := 1;
49     end if;
50   
51     if l_totalpage < p_PageNo then
52       l_curpage  := l_totalpage;
53     end if;
54     --执行分页查询
55     v_ProcedureName := '执行分页查询';
56     l_heiRownum     := l_curpage * p_PageSize;
57     l_lowRownum     := l_heiRownum - p_PageSize + 1;
58   
59     v_sql := 'SELECT *
60               FROM (
61                      SELECT A.*, rownum rn
62                      FROM (' || p_SqlSelect || ') A
63                      WHERE rownum <= ' || to_char(l_heiRownum) || '
64                    ) B
65               WHERE rn >= ' || to_char(l_lowRownum);
66   
67     OPEN p_OutCursor FOR v_sql;
68     res_code   := 0;
69     res_Result := '';
70   Exception
71     when others then
72       res_code   := 1;
73       res_Result := v_ProcedureName || '出现异常,' || chr(10) || '异常号:' ||
74                     sqlcode || '异常信息:' || sqlerrm;
75       rollback;
76   end DL_GETPAGEREDDATA;
77 end PKG_GETPAGERDATA;


 

转载于:https://www.cnblogs.com/SmiledSLQ/p/3481983.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值