Oracle 通用分页存储过程

1.创建游标类型

 

1
2
3
create or replace package PDTypes as
  TYPE ref_cursor IS REF CURSOR;
end;

2.创建分页存储过程

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
PROCEDURE sp_Pager(vp_sql         in varchar2, --查询sql语句
                   vp_ordercolumn in varchar2, --排序字段  
                   vp_orderstyle  in varchar2, --排序方式 
                   vp_currpage    in number,   --当前页
                   vp_pagesize    in number,   --每页显示的记录数
                   vp_totalrow    out number,  --总记录数
                   vp_totalpage   out number,  --总页数
                   vp_cur         out PDTypes.ref_cursor) is
  v_sql         varchar2(4000) := ''; --sql语句
  v_startrecord number(8); --开始记录数
  v_endrecord   number(8); --结束记录数
  v_pagesize    number;
  v_currpage    number;
begin
  v_currpage := vp_currpage;
  v_pagesize := vp_pagesize;
 
  --总记录数
  v_sql := 'select to_number(count(*)) from (' || vp_sql || ') m where 1=1';
 
  execute immediate v_sql
    into vp_totalrow;
 
  --验证页面大小  
  if vp_pagesize < 0 then
    v_pagesize := 0;
  end if;
 
  --根据页面大小计算总页数  
  if mod(vp_totalrow, v_pagesize) = 0 then
    vp_totalpage := vp_totalrow / v_pagesize;
  else
    vp_totalpage := Floor(vp_totalrow / v_pagesize) + 1;
  end if;
 
  --验证页号
  if vp_currpage < 1 then
    v_currpage := 1;
  end if;
 
  if vp_currpage > vp_totalpage then
    v_currpage := vp_totalpage;
  end if;
 
  --实现分页查询
  v_startrecord := (v_currpage - 1) * v_pagesize + 1;
  v_endrecord   := v_currpage * v_pagesize;
  v_sql         := 'select * from (select a.*,rownum r from ' ||
                   '(select * from (' || vp_sql || ') m ';
  if length(trim(vp_ordercolumn)) > 0 then
    v_sql := v_sql || ' order by ' || vp_ordercolumn || ' ' ||
             vp_orderstyle;
  end if;
  v_sql := v_sql || ') a) b where r>=' || v_startrecord || ' and r<=' ||
           v_endrecord;
 
  dbms_output.put_line(v_sql);
  open vp_cur for v_sql;
end;
posted @   回看昨天  阅读(284)  评论(0编辑  收藏  举报
编辑推荐:
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
阅读排行:
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
· C# 13 中的新增功能实操
· Supergateway:MCP服务器的远程调试与集成工具
点击右上角即可分享
微信分享提示