一、游标简介

  SELECT语句得到的是一个结果集,有时我们需要对结果集中的单条数据进行处理。

  这时就需要使用游标,游标定义时和一个SELECT语句的结果集关联在一起。

  游标执行这个结果集,可以在结果集中一行一行的移动,并可以代表执行的单行数据。

  游标就类似指针,可以指向一行数据,并且在数据集上移动。

  

  注:只能在存储过程中才能使用游标。

二、创建游标

  

  创建游标格式:

  DECLARE 游标名 CURSOR FOR  select语句

  这样就在指定的select语句的结果集上建立了游标。

DELIMITER //
CREATE PROCEDURE testCursor()
BEGIN
DECLARE cc CURSOR
FOR
SELECT order_num FROM orders;
END //
DELIMITER ;

  游标的生命周期,只限于存储过程中有效。存储过程结束后,游标也就消失了。

三、开启、关闭游标

  游标定义后还需要打开方可使用,当游标不需要使用时,将游标关闭。

  

DELIMITER //
CREATE PROCEDURE testCursor()
BEGIN
DECLARE cc CURSOR -- 创建游标
FOR
SELECT order_num FROM orders;
OPEN cc; -- 打开游标
CLOSE cc; -- 关闭游标
END //
DELIMITER ;

四、使用游标

  游标打开后,可以使用FEACH访问每一行,FEACH初始情况下指向第一行。

  每一次执行FEACH都会后移一行,

  

DELIMITER //
CREATE PROCEDURE testCursor()
BEGIN
DECLARE orderNum INT; -- 存放检索的order_num
DECLARE cc CURSOR -- 创建游标
FOR
SELECT order_num FROM orders;
OPEN cc; -- 打开游标
FETCH cc INTO o; -- 如果结果集有多列,INTO value1,value2...即可
CLOSE cc; -- 关闭游标
END //
DELIMITER ;

将第一行数据放入变量o中,注意变量o的数据类型要和返回的数据类型一致。

如果游标有多列,cursor INTO value1,value2.。value变量的类型要和对应返回值类型一致。

五、使用游标遍历结果集

税率计算存储过程

DELIMITER //
CREATE PROCEDURE ordertotal(
IN ordernumber DECIMAL(8,2),-- 订单编号
IN tax BOOLEAN , -- 该商品是否计算税金,1为true计算,0位false不计算
OUT total DECIMAL(8,2) -- 最后价格
)
BEGIN
DECLARE total_tmp DECIMAL(8,2); -- 含税价格
DECLARE tax_t INT DEFAULT 6; -- 定义默认税率,6%
SELECT SUM(quantity*item_price)
FROM orderitems
WHERE order_num = ordernumber
INTO total_tmp; -- 首先计算商品不含税总价
IF tax THEN -- 如果tax为1(true) 计算含税总价
SELECT total_tmp * (1 + (tax_t / 100)) INTO total_tmp; --
END IF;
SELECT total_tmp INTO total; -- 将最后价格赋给total
END//
DELIMITER ;
-- 示例
-- CALL ordertotal(20005,1, @total); -- 计算20005号订单价格,含税, 1为true,0为false
-- SELECT @total; -- 显示计算后总价

游标遍历订单,并调用税率计算存储过程计算总价值  

DELIMITER //
CREATE PROCEDURE processorders()
BEGIN
DECLARE o INT; --
DECLARE done BOOLEAN DEFAULT 0;
DECLARE t DECIMAL(8,2);
-- 创建游标
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders; -- 设置结束状态语句,可以看做一个监听器,当出现SQLSTATE为02000时执行SET done=1.
DECLARE CONTINUE HANDLER FOR SQLSTATE '' SET done = 1; -- 创建一张新表,保存计算税率之后的价格
CREATE TABLE IF NOT EXISTS ordertotals
(order_num INT, total DECIMAL(8,2));
-- 打开游标
OPEN ordernumbers; -- 循环获取数据
REPEAT
-- 使用FETCH访问游标的行,将数据(订单编号)放入变量o
FETCH ordernumbers INTO o;
-- 调用税率计算存储过程
CALL ordertotal(o,1,t);
INSERT INTO ordertotals(order_num,total)
VALUES(o,t);
UNTIL done END REPEAT;-- done为1时终止循环
-- 关闭游标
CLOSE ordernumbers;
END// DELIMITER ;
CALL processorders(); -- 调用
SELECT * FROM ordertotals; -- 新表名

参考资料:

《MySQL必知必会》  

1.7(SQL学习笔记)游标的更多相关文章

  1. ORALCE PL/SQL学习笔记

    ORALCE  PL/SQL学习笔记 详情见自己电脑的备份数据资料

  2. PL/SQL学习笔记之游标

    一:游标 Oracle会创建一个上下文区域,用于处理SQL语句,其中包含需要处理的语句.处理结果等等. 游标指向这一上下文的区域. PL/SQL通过控制游标在上下文区域移动,来获取SQL语句的结果信息 ...

  3. Oracle之PL/SQL学习笔记

    自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家 ...

  4. SQL学习笔记

    SQL(Structured Query Language)学习笔记 [TOC] Terminal登录数据库 1.登录mysql -u root -p ; 2.显示所有数据库show database ...

  5. PL/SQL学习笔记(二)

    select * from protype;select * from product;---笛卡尔连接查询(交叉连接)select * from protype,product;select * f ...

  6. PL/SQL学习笔记_02_游标

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

  7. pl/sql学习笔记---马士兵教程38-48

    Procedure Language/Structure query Language 一.关于语言学习 1.数据类型 2.语法   通过例子来学习很快就能明白 set serverputout on ...

  8. [Oracle] PL/SQL学习笔记

    -- 1. 使用一个变量 declare -- Local variables here v_name ); begin -- Test statements here select t.user_n ...

  9. [SQL学习笔记][用exists代替全称量词 ]

    学习sql的必经问题. 学生表student (id学号 Sname姓名 Sdept所在系) 课程表Course (crscode课程号 name课程名) 学生选课表transcript (studi ...

随机推荐

  1. Vue修改mint-ui默认样式(默认风格)

    加入my-mint.css 我这里用的postcss的变量定义,如果亲们用的是其他预处理器,要改成其他处理器的定义方式 覆盖mint-ui的primary颜色,改为自己UI的主题色 --main-co ...

  2. linux系统定时任务设置

    .使用at命令设置一次性定时任务 2.使用crontab设置周期性定时任务 1)cd /home 目录下,使用vi test.py创建文件,内容如下: #!/usr/bin/python#coding ...

  3. learnyounode 题解

    //第三题 var fs =require('fs')var path=process.argv[2]fs.readFile(path,function(err,data){ var lines=da ...

  4. linux和windows下TIME_WAIT过多的解决办法

    http://www.51testing.com/html/48/202848-249774.html linux和windows下TIME_WAIT过多的解决办法 http://m.sohu.com ...

  5. 《自己动手写docker》之namespace部门实验

    动手写一遍,印象不一样! package main import ( "log" "os" "os/exec" "syscall& ...

  6. centos6.5挂载windows共享的文件夹

    参考:http://www.centoscn.com/CentOS/Intermediate/2014/0318/2619.html http://www.ailab.cn/article/20150 ...

  7. Dockerfile 备份

    dotnet core app FROM microsoft/dotnet:1.1.0-runtime WORKDIR /mvcApp COPY ./out . ENTRYPOINT ["d ...

  8. Python全栈开发之1、输入输出与流程控制

    Python简介 python是吉多·范罗苏姆发明的一种面向对象的脚本语言,可能有些人不知道面向对象和脚本具体是什么意思,但是对于一个初学者来说,现在并不需要明白.大家都知道,当下全栈工程师的概念很火 ...

  9. python中的计时器:timeit

    python中的计时器:timeit timeit 通常在一段程序的前后都用上time.time(),然后进行相减就可以得到一段程序的运行时间,不过python提供了更强大的计时库:timeit #导 ...

  10. 使用 JavaScript 在下拉列表中获取选定的值

    使用 JavaScript 在下拉列表中获取选定的值 演示Demo 使用 JavaScript 在下拉列表中获取选定的值? <!DOCTYPE html> <html> < ...