Oracle中游标Cursor的用法详解

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日

相关文章

  • Mysql 日期格式化及复杂日期区间查询

    MySQL 日期格式化是非常常见的数据处理需求,常用于将日期格式化为指定字符串形式,以便于在网页上显示。同时,对于复杂的日期区间查询,也需要使用 MySQL 的日期函数进行处理。下面是详细讲解“Mysql 日期格式化及复杂日期区间查询”的完整攻略。 日期格式化 DATE_FORMAT 函数 DATE_FORMAT 函数可以将日期转换为指定格式的字符串。其语法…

    database 2023年5月22日
    00
  • PHP分页显示制作详细讲解

    让我来详细讲解一下“PHP分页显示制作详细讲解”的完整攻略。 什么是分页显示? 在Web开发中,当数据量很大的时候,我们需要将数据进行分页显示,将大量数据分成若干页,每页显示一定数量的数据,以方便用户查看和浏览。 分页显示的制作方式 下面是使用PHP实现分页显示的步骤: 连接数据库 在使用PHP实现分页显示之前,我们首先需要连接数据库。我们可以使用以下命令连…

    database 2023年5月22日
    00
  • 详解Java中的阻塞队列

    下面我将详细讲解“详解Java中的阻塞队列”的完整攻略。 一、什么是阻塞队列 在Java中,阻塞队列是一个支持在队列为空时等待、队列满时阻塞的队列。阻塞队列常用于生产者和消费者的场景,其中生产者生产消息并将其放入队列,而消费者等待从队列中获取消息进行处理。 Java中阻塞队列类库包含在java.util.concurrent.BlockingQueue中,并…

    database 2023年5月21日
    00
  • Perl访问MSSQL并迁移到MySQL数据库脚本实例

    一、准备工作 在进行Perl访问MSSQL并迁移到MySQL数据库脚本实例之前,需要进行一些准备工作,具体如下: 安装Perl、DBI、DBD::ODBC模块 在开发环境中,需要安装Perl语言环境,并通过Perl模块管理器(如cpanm、ppm)安装DBI和DBD::ODBC模块。 安装Microsoft ODBC驱动程序 在连接MSSQL数据库时,需要安…

    database 2023年5月22日
    00
  • MySQL函数详解

    MySQL函数是一种可以被调用的特定代码段,它可以接收输入参数并返回处理结果。MySQL中包含了多种内置函数,这些函数可以被用于各种不同的场景,例如计算、格式化、比较等。下面是MySQL函数的种类以及作用和使用范围的详细介绍: 数学函数 MySQL中内置了多种用于数学计算的函数,例如ABS、CEILING、FLOOR、ROUND、TRUNCATE等。这些函数…

    MySQL 2023年3月9日
    00
  • linux 系统中软件raid 配置方法

    下面是详细的「Linux 系统中软件 RAID 配置方法」攻略: 什么是软件 RAID? RAID,全称 Redundant Array of Inexpensive Disks,即廉价冗余磁盘阵列。RAID 可以通过多个磁盘组合成一个逻辑卷,从而提供更高的数据可靠性和 I/O 性能,并在单个磁盘失效时保护数据。软件 RAID 就是利用系统软件(Linux …

    database 2023年5月22日
    00
  • Mybatis-plus自动填充不生效或自动填充数据为null原因及解决方案

    下面将详细讲解”Mybatis-plus自动填充不生效或自动填充数据为null原因及解决方案”的攻略。 一、问题描述 当我们在使用Mybatis-plus的自动填充功能时,有时候会遇到自动填充不生效或自动填充数据为null的情况,这时候我们需要找到问题所在并进行解决。 二、原因分析 自动填充不生效或自动填充数据为null的原因通常有以下几种情况: 没有开启自…

    database 2023年5月18日
    00
  • 【SpringBoot】整合Redis实战

    ========================9、SpringBoot2.x整合Redis实战 ================================   1、分布式缓存Redis介绍 简介:讲解为什么要用缓存和介绍什么是Redis,新手练习工具 通过缓存减少数据库访问,提高访问速度 1、redis官网 https://redis.io/down…

    Redis 2023年4月13日
    00
合作推广
合作推广
分享本页
返回顶部