游标

游标是一个重要的概念,提供了一种灵活的操作方式,可以从数据结果集中每次提取一条数据记录进行操作。

在SQL中,游标是一种临时的数据库对象,可以指向存储在数据库中的数据行指针。

示例

-查询heros数据表中最大生命值大于8500的英雄有哪些

SELECT id, name, hp_max FROM heros WHERE hp_max > 8500

查询结果

如何使用游标

游标实际上是一种控制数据集的更加灵活的处理方式

使用游标,一般需要5个步骤:

第一步:定义游标

DECLARE cursor_name CURSOR FOR select_statement

语法适用于MySQL,SQL Server,DB2

Oracle或者PostgreSQL需要写成

DECLARE cursor_name CURSOR IS select_statement

注:select_statement代表的是SELECT语句

第二步:打开游标

OPEN cursor_name

当定义好游标之后,想要使用游标,必须先打开游标。打开游标的时候SELECT语句的查询结果集就会送到游标工作区。

第三步:从游标中取得数据

FETCH cursor_name INTO var_name ...

这句的作用是使用cursor_name这个游标来读取当前行,并且将数据保存到var_name这个变量中,游标指针直到下一行。

第四步:关闭游标

CLOSE cursor_name

有OPEN就会有CLOSE,也就是打开和关闭游标。

第五步:释放游标

DEALLOCATE cursor_namec

有SECLARE就需要有DEALLOCATE,DEALLOCATE的作用是释放游标。

游标实战

实例

- 用游标来扫描heros数据表中的数据行,然后累计最大生命值

CREATE PROCEDURE `calc_hp_max`()BEGIN       -- 创建接收游标的变量       DECLARE hp INT;         -- 创建总数变量        DECLARE hp_sum INT DEFAULT 0;       -- 创建结束标志变量         DECLARE done INT DEFAULT false;       -- 定义游标            DECLARE cur_hero CURSOR FOR SELECT hp_max FROM heros;       OPEN cur_hero;       read_loop:LOOP        FETCH cur_hero INTO hp;       SET hp_sum = hp_sum + hp;       END LOOP;       CLOSE cur_hero;       SELECT hp_sum;END

执行call calc_hp_max()的时候系统会提示1329错误,也就是在LOOP中当游标没有取到数据时会报的错误。

当游标溢出时(也就是当游标指向最后一行数据后继续执行会报的错误)。可以定义continue的事件,指定这个事件发生时修改变量done的值,以此来判断游标是否已经溢出。

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;

同时在循环中加上对done的判断,如果游标的循环已经结束,就需要跳出read_loop循环。

CREATE PROCEDURE `calc_hp_max`()BEGIN       -- 创建接收游标的变量       DECLARE hp INT;         -- 创建总数变量        DECLARE hp_sum INT DEFAULT 0;       -- 创建结束标志变量       DECLARE done INT DEFAULT false;       -- 定义游标            DECLARE cur_hero CURSOR FOR SELECT hp_max FROM heros;       -- 指定游标循环结束时的返回值       DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;         OPEN cur_hero;       read_loop:LOOP        FETCH cur_hero INTO hp;       -- 判断游标的循环是否结束         IF done THEN                       LEAVE read_loop;       END IF;        SET hp_sum = hp_sum + hp;       END LOOP;       CLOSE cur_hero;       SELECT hp_sum;END

运行结果

除了LOOP循环以外,还可以使用REPEAT...UNTIL...以及WHILE循环。

总结

sql 游标_SQL基础丨游标相关推荐

  1. mysql基础sql语句_SQL基础语句汇总

    引言 是时候复习一波SQL语句的语法了,无需太深,但总得会用啊. 语法 一步步由浅到深,这里用的都是mysql做的. 基础 连接数据库 mysql -h10.20.66.32 -uroot -p123 ...

  2. mysql 事务回滚_SQL基础丨事务处理

    事务的特性:ACID MySQL5.5版本之前,默认的存储引擎是MyISAM,在5.5版本之后默认存储引擎是InnoDB.两者唯一的区别就是InnoDB支持事务. 事务的英文是transaction, ...

  3. mysql 存储过程 sql变量_SQL基础-变量 存储过程和函数

    一.变量 1.系统变量:全局变量.会话变量 说明:由系统提供,属于服务器层面.如果是全局级别,则需要加 global,如果是会话级别,则需加 session,如果不写,则默认 session.全局变量 ...

  4. SQL Server之游标的基础知识

    什么是游标: 游标是可以在结果集中上下游动的指针. 游标的作用: --允许定位到结果集中的特定行. --从结果集的当前位置检索一行或多行数据. --支持对结果集中当前位置的行进行修改. 注意:游标虽然 ...

  5. MS SQL入门基础:打开游标

    打开游标游标在声明以后,如果要从游标中读取数据必须打开游标.打开一个Transact-SQL服务器游标使用OPEN 命令,其语法规则为: OPEN { { [GLOBAL] cursor_name } ...

  6. SQL server 游标(只进游标)讲解

    游标概念: SQL的游标是一种临时的数据库对象,既可以存放储存在数据库表中数据行的副本,也可以指向储存在数据库中的数据行的指针,游标提供了在逐行的基础上操作表中数据的方法. 游标的作用: 1.定位到结 ...

  7. oracle游标的基础应用,Oracle 基础的游标的使用

    基础的游标的使用 -- Created on2017-01-03 星期二 by ADMINISTRATOR declare --申明游标 cursor mycursor is select * fro ...

  8. 【Oracle】PL/SQL 显式游标、隐式游标、动态游标

    在PL/SQL块中执行SELECT.INSERT.DELETE和UPDATE语句时,Oracle会在内存中为其分配上下文区(Context Area),即缓冲区.游标是指向该区的一个指针,或是命名一个 ...

  9. PL/SQL程序设计 第四章 游标的使用

    在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现. §4.1 游标概念 为了处理 SQL 语句,ORACLE 必须分配一片叫上下文( context area )的区域来处理所必需的 ...

最新文章

  1. 大话设计模式笔记(七)の原型模式
  2. 成为机器学习工程师第一年,我学到的 12 件事
  3. 4个重要的量子理论实验综述
  4. python对字幕的改动
  5. Python统计在一个队列中有多少个正数,多少个负数
  6. 在一个字符串中找到第一个只出现一次的字符
  7. python简易发红包_学习python:练习5.简单红包程序
  8. 2MyBatis入门--深入浅出MyBatis技术原理与实践(笔记)
  9. Metro风格的Android界面应用
  10. dategurd oracle_Oracle之11g DataGuard
  11. 局部临时表 全局临时表 表变量
  12. (三)mybatisPlus自定义Sql语句
  13. 最常用的计算机色彩表示方法——RGB模式与CMYK模式
  14. 前端应届简历应该怎么写?
  15. Android插件化开发指南——实践之ViewPager+Fragment优化(预加载和懒加载)
  16. 锁定计算机过久电脑自动关机,如何设置电脑在某个或一段时间后自动关机
  17. jQuery实现消息提示框
  18. 如何禁止搜索引擎收录WordPress站点某个分类的文章?
  19. VS Code, VS 2022 使用正则表达式进行替换
  20. MySQL的下载与安装教程--超详细

热门文章

  1. 生存分析-从survdiff函数中提取P值
  2. The Third Revolution in Sequencing Technology
  3. 第三代测序为什么这么贵?
  4. c语言中的常用函数的使用,C语言的常用库函数使用方法分析及用途
  5. mysql为什么直接8.0_为什么要迁移到MySQL8.0?
  6. flask 作为 three.js 的服务器
  7. 【openfst样例1】Tokenization
  8. 在Python中使用LLVM接口:llvmpy和llvmlite
  9. html中js定义数组,javascript数组的定义及操作实例
  10. C++_reference