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日

相关文章

  • 解决python3.6用cx_Oracle库连接Oracle的问题

    下面是“解决python3.6用cx_Oracle库连接Oracle的问题”的完整攻略: 1. 安装cx_Oracle库 首先,需要安装cx_Oracle库,可以使用pip命令进行安装: pip install cx_Oracle 2. 安装Oracle Instant Client cx_Oracle库需要Oracle Instant Client作为驱动…

    database 2023年5月18日
    00
  • redis 在 php 中的应用(Server[ 服务器] 篇)

    本文为我阅读了 redis参考手册 之后编写,注意 php_redis 和 redis-cli 的区别(主要是返回值类型和参数用法) 目录: Server(服务器) BGREWRITEAOF BGSAVE SAVE LASTSAVE DBSIZE SLAVEOF FLUSHALL FLUSHDB SLOWLOG INFO CONFIG GET CONFIG …

    Redis 2023年4月11日
    00
  • python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析

    了解了题目要求。首先,这篇攻略是针对想要学习使用Python通过爬虫爬取猫眼电影和电影天堂的数据,并将数据存储到CSV和MySQL中的开发者。以下是完整攻略的步骤: 1. 确定需求 在开始编写爬虫之前,我们需要先明确自己需要爬取哪些数据,比如需要爬取电影名称、导演、演员、上映时间等信息。然后我们需要确定数据存储的方式,常用的有CSV和MySQL,两种存储方式…

    database 2023年5月21日
    00
  • Linux下指定mysql数据库数据配置主主同步的实例

    针对这个问题,我会提供一个完整的攻略以指导Linux下如何实现MySQL数据库主主同步配置。步骤如下: 准备工作 确认MySQL版本一致性,要求两个MySQL实例的版本必须一致。 开启MySQL二进制日志,可以通过修改my.cnf配置文件,将以下参数加入到[mysqld]组中:log-bin=mysql-bin 步骤一:创建复制账户并授权 在两个MySQL实…

    database 2023年5月22日
    00
  • Mysql数据库 ALTER 操作详解

    Mysql数据库 ALTER 操作详解 什么是ALTER操作? ALTER是MySQL中用于修改表结构的关键词,其可以根据需要增加、修改或删除数据库表中已存在的列,增加或删除索引,约束或整个表。ALTER操作可以让用户更好地适应现实业务需求。 ALTER操作类型 ALTER操作包括以下几种类型: 修改表名 修改列属性 添加列 删除列 添加索引 删除索引 添加…

    database 2023年5月22日
    00
  • mysql中操作表常用的sql总结

    下面是关于“mysql中操作表常用的SQL总结”的完整攻略: MySQL中操作表常用的SQL总结 1. 创建表 MySQL中创建表的语法为: CREATE TABLE table_name ( column1 datatype, column2 datatype, column3 datatype, …… ); 其中,table_name 表的名称,…

    database 2023年5月22日
    00
  • CentOS 6.3下源码安装LAMP(Linux+Apache+Mysql+Php)运行环境步骤

    CentOS 6.3下源码安装LAMP运行环境步骤 本文将介绍如何在CentOS 6.3下使用源码安装的方式安装LAMP运行环境。 安装 Apache 1. 安装依赖 在安装 Apache 之前,需要先安装一些必要的软件包: sudo yum install gcc apr-devel apr-util-devel pcre-devel 2. 下载和解压 从…

    database 2023年5月22日
    00
  • 实例操作MySQL短链接

    下面我来为您详细讲解“实例操作MySQL短链接”的完整攻略。 什么是MySQL短链接 MySQL短链接指的是对MySQL的连接进行优化,通过避免长时间或者过多的连接,尽可能的提高MySQL数据库的连接效率和响应速度,这就是MySQL短链接。 实现MySQL短链接的步骤 下面是实现MySQL短链接的步骤: 步骤一、创建数据库连接。创建 MySQL 数据库连接时…

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