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建表及练习题(上)

          create table student( sno varchar(20)not null primary key, sname varchar(20)not null, ssex varchar(20)not null, sbirthday datetime null, class varchar(20)null ); insert into …

    MySQL 2023年4月13日
    00
  • 浅析mysql 定时备份任务

    下面是详细讲解“浅析mysql 定时备份任务”的完整攻略。 1. 了解mysql备份 MySQL备份是指将MySQL数据库中的数据备份到某个文件中,以便在需要时能够恢复数据。通过备份MySQL数据库,可以保证数据的安全和稳定。MySQL的备份一般分为两种:物理备份和逻辑备份。 物理备份:直接备份数据库的物理文件,包括数据文件、日志文件等,可以在备份文件被还原…

    database 2023年5月22日
    00
  • mysql定时自动备份数据库的方法步骤

    下面是关于如何使用MySQL实现定时自动备份数据库的方法步骤及示例说明。 一、准备工作 在进行MySQL定时自动备份操作之前,需要做好以下准备工作: 确认备份策略:定期备份是保障数据安全的重要措施,但需要根据业务需求制定好备份策略,包括备份频率、存储位置、备份方式等。 安装定时任务工具:MySQL自带定时任务功能,但不太方便,因此建议安装第三方定时任务工具,…

    database 2023年5月22日
    00
  • ubuntu 20.04上搭建LNMP环境的方法步骤

    以下是在Ubuntu 20.04上搭建LNMP环境的详细步骤: 步骤一:安装Nginx 首先,在终端中输入以下命令安装Nginx: sudo apt update sudo apt install nginx 安装完成后,输入以下命令启动Nginx: sudo systemctl start nginx 以上命令还可被简写为: sudo systemctl …

    database 2023年5月22日
    00
  • redis的简单介绍、搭建及java连接测试

      Nosql特点:1、不支持SQL语法 2、存储结构跟传统关系型数据库中的那种关系表完全不同,nosql中存储的数据都是KV形式 3、 NoSQL的世界中没有一种通用的语言,每种nosql数据库都有自己的api和语法,以及擅长的业务场景 4、 NoSQL中的产品种类相当多:   Redis既是NoSQL众多产品种类中的一种 redis 是一个由Salvat…

    Redis 2023年4月12日
    00
  • 如何在Python中删除MongoDB数据库中的数据?

    以下是在Python中删除MongoDB数据库中的数据的完整使用攻略。 使用MongoDB数据库的前提条件 在使用Python连接MongoDB数据库之前,确保已MongoDB数据库,并已创建使用数据库和集合,同时需要安Python的驱动程序,例如pymongo。 步骤1:导入模块 在Python中使用pymongo模块连接MongoDB数据库。以下是导入p…

    python 2023年5月12日
    00
  • SQL Server 完整备份遇到的一个不常见的错误及解决方法

    SQL Server 完整备份遇到的一个不常见的错误及解决方法 问题描述 在进行 SQL Server 的完整备份时,有时会遇到以下的错误提示信息: Msg 3033, Level 16, State 0, Line 1BACKUP DATABASE cannot be used on a database opened in emergency mode.…

    database 2023年5月21日
    00
  • MySQL8数据库安装及SQL语句详解

    MySQL8数据库安装及SQL语句详解 MySQL8数据库安装 要安装MySQL8数据库,可以按照以下步骤进行: 下载MySQL8的安装包。 官方下载地址:https://dev.mysql.com/downloads/mysql/ 安装MySQL8。 双击下载的mysql安装包,按照提示进行安装,过程中可以自行选择安装路径和配置。 设置root用户密码。 …

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