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 ...
随机推荐
- sqlite3使用简介
sqlite3使用简介 一.使用流程 要使用sqlite,需要从sqlite官网下载到三个文件,分别为sqlite3.lib,sqlite3.dll,sqlite3.h,然后再在自己的工程中配置好头文 ...
- caffe Python API 之BatchNormal
net.bn = caffe.layers.BatchNorm( net.conv1, batch_norm_param=dict( moving_average_fraction=0.90, #滑动 ...
- shell中的变量与eval(转)
原文链接:http://www.361way.com/shell-eval-variable/4957.html shell 中经常会用到变量的嵌套的情况.比如,单个或多个变量的值作为变量名,再对该变 ...
- IT行业经典面试技巧及方法思路。
问题1:为什么从上家公司离职?”能说说原因吗? 首先,作为一个从事招聘的HR,并不认为追问面试者为什么从上一家公司离职是个明智的做法起码不应该在面试一开始就抛出这个问题,一个较为明显的原因是因为这会引 ...
- C++随笔(2)
在牛客网上刷题,遇到的一些需要注意的题 1.这题需要注意的是strcpy复制的时候什么时候停止 2.这题是关于strlen的,它不统计‘\0',但复制的时候仍会复制. 3.这题是写strcpy函数的, ...
- HDU 4370 0 or 1(spfa+思维建图+计算最小环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4370 题目大意:有一个n*n的矩阵Cij(1<=i,j<=n),要找到矩阵Xij(i< ...
- Linux 用户篇——用户管理命令之useradd、passwd、userdel、usermod
一.用户重要,用户管理命令同样重要 用户是Linux系统安全的核心,每个登录Linux系统的用户都会分配相应的权限,这些权限取决于能否访问系统中各种对象.而管理这些用户的相关信息离不开用户管理命令,比 ...
- Flume(一)Flume的基础介绍与安装
一.背景 Hadoop业务的整体开发流程: 从Hadoop的业务开发流程图中可以看出,在大数据的业务处理过程中,对于数据的采集是十分重要的一步,也是不可避免的一步. 许多公司的平台每天会产生大量的日志 ...
- Typecho-反序列化漏洞学习
目录 Typecho-反序列化漏洞学习 0x00 前言 0x01 分析过程 0x02 调试 0x03 总结 0xFF 参考 Typecho-反序列化漏洞学习 0x00 前言 补丁: https://g ...
- lr中用strtok函数分割字符串
需要在loadrunner里面获得“15”(下面红色高亮的部分),并做成关联参数. ,6,5,0,4,0,3,0,3,2,0,0,0,1 用web_reg_save_param取出“8,7,5,15, ...