0

0

oracle分页的存储过程

WBOY

WBOY

发布时间:2023-05-20 09:53:37

|

529人浏览过

|

来源于php中文网

原创

oracle是一款强大的数据库管理系统,支持存储过程等高级特性,方便程序员编写复杂的业务逻辑。在一些特定的场景下,需要对大量的数据进行分页查询。为了实现这一目的,我们可以编写一个分页的存储过程。本文将介绍如何编写oracle分页存储过程。

一、需求分析

在网站开发中,经常会遇到需要对用户提交的数据进行分页展示的情况。例如,查询一张表中的所有记录,如果一次性查询出所有记录,会对数据库造成严重的性能压力,也会影响用户的体验。因此,将数据分页展示是一种比较好的解决方案。下面我们来分析一下需求:

  1. 获取总记录数
  2. 根据每页大小和当前页码,计算出起始记录和截止记录的位置
  3. 根据起始记录和截止记录查询出所需的数据

二、存储过程设计

基于以上需求分析,我们可以设计如下的Oracle分页存储过程:

CREATE OR REPLACE PROCEDURE pagination(p_table_name IN VARCHAR2,
                                        p_page_num IN NUMBER,
                                        p_page_size IN NUMBER,
                                        p_total_num OUT NUMBER,
                                        p_cursor OUT SYS_REFCURSOR) IS
  v_start_pos NUMBER;
  v_end_pos NUMBER;
  v_sql_query VARCHAR2(1000);
BEGIN
  SELECT COUNT(*) INTO p_total_num FROM p_table_name;
  v_start_pos := (p_page_num - 1) * p_page_size + 1;
  v_end_pos := v_start_pos + p_page_size - 1;
  v_sql_query := 'SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM ' || p_table_name || ') A WHERE ROWNUM <= ' || v_end_pos || ') WHERE RN >= ' || v_start_pos;
  OPEN p_cursor FOR v_sql_query;
END;
/

以上代码会创建一个名为pagination的存储过程,可以接收4个参数:表名、页码、每页大小和总记录数。其中,p_cursor为输出参数,用于返回查询结果的游标。

三、存储过程说明

  1. SELECT COUNT(*) INTO p_total_num FROM p_table_name;
    该语句用于查询表中的总记录数,并将结果存入p_total_num中。通过这个变量,我们可以计算出总页数和当前页的记录范围。
  2. v_start_pos := (p_page_num - 1) * p_page_size + 1;
    该语句用于计算起始记录的位置,由页码和每页大小计算得出。
  3. v_end_pos := v_start_pos + p_page_size - 1;
    该语句用于计算截止记录的位置,同样由页码和每页大小计算得出。
  4. v_sql_query := 'SELECT FROM (SELECT A., ROWNUM RN FROM (SELECT * FROM ' || p_table_name || ') A WHERE ROWNUM = ' || v_start_pos;
    该语句是查询语句,用于查询表中指定范围内的数据。其中ROWNUM是Oracle特有的伪列,表示每条记录的行号。我们利用ROWNUM限制了查询范围,并通过嵌套查询加入了RN列,表示当前记录的行号。最后,根据起始位置和截止位置限制了查询结果的范围。
  5. OPEN p_cursor FOR v_sql_query
    该语句用于执行查询语句,并将结果储存于游标p_cursor中,这个游标可以用于后续的数据操作和传递。

四、测试案例

为了验证存储过程是否正确,我们可以创建一张测试表,并向表中插入一些数据:

MvMmall 网店系统
MvMmall 网店系统

免费的开源程序长期以来,为中国的网上交易提供免费开源的网上商店系统一直是我们的初衷和努力奋斗的目标,希望大家一起把MvMmall网上商店系统的免费开源进行到底。2高效的执行效率由资深的开发团队设计,从系统架构,数据库优化,配以通过W3C验证的面页模板,全面提升页面显示速度和提高程序负载能力。3灵活的模板系统MvMmall网店系统程序代码与网页界面分离,灵活的模板方案,完全自定义模板,官方提供免费模

下载
CREATE TABLE test(
  id NUMBER(10) PRIMARY KEY,
  name VARCHAR2(50)
);

DECLARE 
  v_id NUMBER;
BEGIN
  FOR i IN 1..100 LOOP
    v_id := i;
    INSERT INTO test(id,name) VALUES(v_id,'name'||v_id);
  END LOOP;
  COMMIT;
END;
/

接着,我们可以执行以下代码来测试我们的存储过程:

DECLARE
  v_page_num NUMBER := 1;
  v_page_size NUMBER := 10;
  v_total_num NUMBER;
  v_cursor SYS_REFCURSOR;
  v_id NUMBER;
  v_name VARCHAR2(50);
BEGIN
  pagination('test',v_page_num,v_page_size,v_total_num,v_cursor);
  
  DBMS_OUTPUT.PUT_LINE('Total number of records: ' || v_total_num);
  LOOP
    FETCH v_cursor INTO v_id,v_name;
    EXIT WHEN v_cursor%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE('Id: '||v_id ||', Name: '|| v_name);
  END LOOP;
  CLOSE v_cursor;
END;
/

以上代码将会输出1~10条记录的id和name的值。

通过测试结果可以看出,我们编写的分页存储过程可以正确的计算出记录范围,并且查询结果也正确。这个存储过程可以在查询数据时,有效的减少数据库的压力,同时避免了一次性查询过多的数据时带来的性能问题。

除此之外,我们还可以根据实际的需求,调整存储过程中的参数和查询语句,以适应更加复杂的查询场景。

五、总结

在Oracle数据库中,存储过程是一种非常重要的特性,它可以帮助我们编写复杂的业务逻辑和数据操作流程,提高数据库操作的效率和可维护性。本文介绍了如何编写Oracle分页存储过程,通过分析需求、设计算法和编写代码,在了解Oracle存储过程的基础上,实现了一个简单的分页存储过程。通过学习本文案例,有助于读者更好地掌握Oracle存储过程的编写方法和技巧。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

4

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

3

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

10

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

33

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

15

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

42

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

7

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

9

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

6

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号