Oracle中游标Cursor的用法详解

yizhihongxing

Oracle中游标Cursor的用法详解

什么是游标Cursor

在Oracle数据库中,利用游标可以对查询结果集进行遍历、选择、修改等操作。游标是一个数据缓存区,用于存储一个查询结果集,可以在程序中对其进行一次或多次遍历,也可以对其进行 select ... into ... 多行赋值操作。

游标的基本语法

游标的基本语法如下:

DECLARE
  --定义游标
  CURSOR cursor_name IS select_statement;
BEGIN
  --打开游标
  OPEN cursor_name;
  --依次获取游标中每个结果行
  LOOP
    FETCH cursor_name INTO variable1, variable2, ..., variablen;
    EXIT WHEN cursor_name%NOTFOUND;
    --处理获取到的数据
  END LOOP;

  --关闭游标
  CLOSE cursor_name;
END;

其中,CURSOR关键字用于定义游标,且游标名必须唯一;OPEN语句用于打开游标,FETCH语句用于获取游标中的一行数据,需要定义一些变量来存储获取到的数据;%NOTFOUND关键字用于判断游标是否已经到达结果集的末尾;LOOP语句用于循环获取游标中的每一行数据,直到结果集的末尾;CLOSE语句用于关闭游标,释放相应的资源。

游标的示例应用

以下是两个游标的使用示例:

示例一:通过游标统计图书销售量

假设我们有以下两个表:

  • books:存储书籍信息
  • sales:存储销售记录
CREATE TABLE books (
  book_id NUMBER(10) PRIMARY KEY,
  book_name VARCHAR2(50),
  author VARCHAR2(50),
  price NUMBER(10, 2),
  pub_date DATE
);

CREATE TABLE sales (
  sale_id NUMBER(10) PRIMARY KEY,
  book_id NUMBER(10),
  sale_date DATE,
  quantity NUMBER(5),
  FOREIGN KEY (book_id) REFERENCES books(book_id)
);

INSERT INTO books (book_id, book_name, author, price, pub_date) VALUES (1, 'Java编程思想', 'Bruce Eckel', 99.00, DATE '2006-09-01');
INSERT INTO books (book_id, book_name, author, price, pub_date) VALUES (2, 'Head First 设计模式', 'Freeman等', 79.00, DATE '2004-10-01');
INSERT INTO sales (sale_id, book_id, sale_date, quantity) VALUES (1, 1, DATE '2018-01-01', 10);
INSERT INTO sales (sale_id, book_id, sale_date, quantity) VALUES (2, 1, DATE '2018-01-05', 20);
INSERT INTO sales (sale_id, book_id, sale_date, quantity) VALUES (3, 2, DATE '2018-01-01', 30);
INSERT INTO sales (sale_id, book_id, sale_date, quantity) VALUES (4, 2, DATE '2018-01-06', 40);

我们需要统计所有书籍的销售总量,并按照销售量从高到低排序输出。可以使用以下游标代码:

DECLARE
  --定义游标
  CURSOR c_sale_count IS 
    SELECT b.book_id, b.book_name, SUM(s.quantity) AS sales_count
    FROM books b
    JOIN sales s ON b.book_id = s.book_id
    GROUP BY b.book_id, b.book_name
    ORDER BY sales_count DESC;

  --定义变量
  v_book_id books.book_id%TYPE;
  v_book_name books.book_name%TYPE;
  v_sales_count NUMBER;
BEGIN
  --打开游标
  OPEN c_sale_count;
  --依次获取游标中每个结果行
  LOOP
    FETCH c_sale_count INTO v_book_id, v_book_name, v_sales_count;
    EXIT WHEN c_sale_count%NOTFOUND;
    --处理获取到的数据
    DBMS_OUTPUT.PUT_LINE(v_book_name || ':' || v_sales_count);
  END LOOP;

  --关闭游标
  CLOSE c_sale_count;
END;

这段代码定义了一个游标,然后使用循环遍历游标中的每一行数据,将数据输出到控制台上。执行该代码后,控制台会输出以下结果:

Head First 设计模式:70
Java编程思想:30

示例二:通过游标修改图书价格

假设我们需要将书籍的价格打8折,并更新到数据库中,可以使用以下游标代码:

DECLARE
  --定义游标
  CURSOR c_books IS SELECT * FROM books;

  --定义变量
  v_book_id books.book_id%TYPE;
  v_book_name books.book_name%TYPE;
  v_author books.author%TYPE;
  v_price books.price%TYPE;
  v_pub_date books.pub_date%TYPE;
BEGIN
  --打开游标
  OPEN c_books;
  --依次获取游标中每个结果行
  LOOP
    FETCH c_books INTO v_book_id, v_book_name, v_author, v_price, v_pub_date;
    EXIT WHEN c_books%NOTFOUND;
    --处理获取到的数据
    UPDATE books SET price = v_price * 0.8 WHERE book_id = v_book_id;
  END LOOP;

  --关闭游标
  CLOSE c_books;
  COMMIT;
END;

这段代码定义了一个游标,然后使用循环遍历游标中的每一行数据,将价格打8折后更新到数据库中。注意,在修改完数据后需要执行 COMMIT 语句提交事务。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Oracle中游标Cursor的用法详解 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • C++中POCO库的安装与基础知识介绍(Windwos和Linux)

    C++中POCO库的安装与基础知识介绍(Windwos和Linux) 什么是POCO库 POCO库是一个C++开源工具库,其提供了一系列灵活、可移植、易于使用的类和组件,广泛用于开发跨平台的网络和服务器应用程序。 该库的核心部分包含了对线程、多线程、套接字通信、文件系统、XML解析、数据库等功能的封装,同时还提供了一些常用的工具类,如时间日期类、命令行参数解…

    database 2023年5月22日
    00
  • python 基于Apscheduler实现定时任务

    请看下面的攻略步骤。 准备工作 安装Apscheduler模块:在终端下输入命令pip install apscheduler即可。 基本使用 首先导入Apscheduler相关模块 python from apscheduler.schedulers.blocking import BlockingScheduler 实例化一个调度器 python sch…

    database 2023年5月22日
    00
  • Java实战之实现物流配送系统示例详解

    Java实战之实现物流配送系统示例详解是一个非常实用的项目实战体验,让我们可以用实际的场景来学习Java技术,对于Java初学者和中级开发者,都有一定的参考价值。以下是详细的攻略: 项目概述 Java实战之实现物流配送系统是一个综合性的项目,主要用于演示如何使用Java技术来完成一个物流配送系统。该项目集成了多个技术领域,包括Java Web、Spring …

    database 2023年5月22日
    00
  • 详解Mysql基础语法的使用

    详解Mysql基础语法的使用 MySQL是世界流行的关系型数据库管理系统,具有丰富的功能和易于使用的特点。在本文中,我们将深入探讨MySQL基础语法的使用,包括如何创建和删除数据库,以及如何创建、修改和删除表格等。 创建和删除数据库 使用MySQL创建数据库非常简单,只需要使用CREATE DATABASE命令: CREATE DATABASE mydata…

    database 2023年5月22日
    00
  • 百万级别知乎用户数据抓取与分析之PHP开发

    以下是百万级别知乎用户数据抓取与分析之PHP开发的完整攻略: 1. 准备工作 在开始之前,需要先安装PHP环境和相关扩展,如CURL扩展、SimpleXML扩展等。 除此之外,还需要获取知乎的API访问令牌,可以参考知乎开放平台官方文档进行获取和配置。 2. 数据抓取 在完成准备工作之后,就可以开始进行数据抓取了。 2.1. 获取用户ID列表 首先需要获取一…

    database 2023年5月22日
    00
  • centos 7系统下安装laravel运行环境的步骤详解

    接下来我将详细讲解在CentOS 7系统下安装Laravel运行环境的步骤,其中包含以下几个步骤: 步骤一:安装Apache和PHP 首先,我们需要安装Apache以及PHP。我们可以通过以下命令来安装: sudo yum install httpd php php-mysql 安装完毕后,启动Apache服务: sudo systemctl start h…

    database 2023年5月22日
    00
  • go操作redis

    导学: 如何学习? 本人建议先安装redis,如何在命令敲一遍,最后再用go来实现效果更好。实战!实战!不实战就是凉凉!!!!!!! 1.1什么是redis? redis:远程字典服务,是一种运行在内存上的非关系型数据库,它支持的数据类型有:字符串,哈希表,列表,集合(集合分有序/无序)。redisd的所有操作均是原子性的,redis不仅多个操作支持事务,而…

    Redis 2023年4月10日
    00
  • SQL Server多表查询优化方案集锦

    SQL Server多表查询优化方案集锦 在SQL Server中,多表查询时会面临到性能瓶颈的问题,需要使用一些优化方案来提高查询效率。本文将介绍一些多表查询的优化方案,帮助读者优化SQL Server多表查询性能。 1. 合理使用索引 索引是一种重要的优化手段,可以加快查询速度。在多表查询时,尤其需要合理使用索引,可以使用下面这些方法: 1.1. 创建合…

    database 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部