1.7(SQL学习笔记)游标
一、游标简介
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学习笔记)游标的更多相关文章
- ORALCE PL/SQL学习笔记
ORALCE PL/SQL学习笔记 详情见自己电脑的备份数据资料
- PL/SQL学习笔记之游标
一:游标 Oracle会创建一个上下文区域,用于处理SQL语句,其中包含需要处理的语句.处理结果等等. 游标指向这一上下文的区域. PL/SQL通过控制游标在上下文区域移动,来获取SQL语句的结果信息 ...
- Oracle之PL/SQL学习笔记
自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家 ...
- SQL学习笔记
SQL(Structured Query Language)学习笔记 [TOC] Terminal登录数据库 1.登录mysql -u root -p ; 2.显示所有数据库show database ...
- PL/SQL学习笔记(二)
select * from protype;select * from product;---笛卡尔连接查询(交叉连接)select * from protype,product;select * f ...
- PL/SQL学习笔记_02_游标
在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现. 为了处理 SQL 语句, ORACLE 必须分配一片叫上下文( context area )的区域来处理所必需的信息,其中包括要处 ...
- pl/sql学习笔记---马士兵教程38-48
Procedure Language/Structure query Language 一.关于语言学习 1.数据类型 2.语法 通过例子来学习很快就能明白 set serverputout on ...
- [Oracle] PL/SQL学习笔记
-- 1. 使用一个变量 declare -- Local variables here v_name ); begin -- Test statements here select t.user_n ...
- [SQL学习笔记][用exists代替全称量词 ]
学习sql的必经问题. 学生表student (id学号 Sname姓名 Sdept所在系) 课程表Course (crscode课程号 name课程名) 学生选课表transcript (studi ...
随机推荐
- Caffe提取任意层特征并进行可视化
现在Caffe的Matlab接口 (matcaffe3) 和python接口都非常强大, 可以直接提取任意层的feature map以及parameters, 所以本文仅仅作为参考, 更多最新的信息请 ...
- java反序列化漏洞
http://www.freebuf.com/vuls/86566.html 有时间了 仔细阅读
- arch优化开机
查看开机时间 systemd-analyze 具体开机时间 systemd-analyze blame 你可以systemctl --all | grep not-found 查看有哪些服务挂掉了.然 ...
- linux下生成core dump文件方法及设置【转】
转自:http://blog.csdn.net/mrjy1475726263/article/details/44116289 源自:http://andyniu.iteye.com/blog/196 ...
- xv6/bootasm.S + xv6/bootmain.c
xv6/bootasm.S #include "asm.h" #include "memlayout.h" #include "mmu.h" ...
- python基础===数据伪造模块faker
介绍文档: https://pypi.org/project/Faker/ https://faker.readthedocs.io/en/latest/ https://faker.readthed ...
- Android的休眠与唤醒
Android 休眠(suspend),在一个打过android补丁的内核中,state_store()函数会走另外一条路,会进入到request_suspend_state()中,这个文件在earl ...
- Firefox缓存文件夹位置设置及清除缓存方法
地址栏敲入: about:config, 新建一个"browser.cache.disk.parent_directory", 并设置为你要的缓存文件夹, 例如: "F ...
- What I Learned as a Junior Developer Writing Tests for Legacy Code(转载)
I go to the gym and lift weights because I like the feeling of getting stronger and better. Two mont ...
- CentOS7安装Hadoop2.7完整步骤
总体思路,准备主从服务器,配置主服务器可以无密码SSH登录从服务器,解压安装JDK,解压安装Hadoop,配置hdfs.mapreduce等主从关系. 1.环境,3台CentOS7,64位,Hadoo ...