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 ...
随机推荐
- Vue修改mint-ui默认样式(默认风格)
加入my-mint.css 我这里用的postcss的变量定义,如果亲们用的是其他预处理器,要改成其他处理器的定义方式 覆盖mint-ui的primary颜色,改为自己UI的主题色 --main-co ...
- linux系统定时任务设置
.使用at命令设置一次性定时任务 2.使用crontab设置周期性定时任务 1)cd /home 目录下,使用vi test.py创建文件,内容如下: #!/usr/bin/python#coding ...
- learnyounode 题解
//第三题 var fs =require('fs')var path=process.argv[2]fs.readFile(path,function(err,data){ var lines=da ...
- linux和windows下TIME_WAIT过多的解决办法
http://www.51testing.com/html/48/202848-249774.html linux和windows下TIME_WAIT过多的解决办法 http://m.sohu.com ...
- 《自己动手写docker》之namespace部门实验
动手写一遍,印象不一样! package main import ( "log" "os" "os/exec" "syscall& ...
- centos6.5挂载windows共享的文件夹
参考:http://www.centoscn.com/CentOS/Intermediate/2014/0318/2619.html http://www.ailab.cn/article/20150 ...
- Dockerfile 备份
dotnet core app FROM microsoft/dotnet:1.1.0-runtime WORKDIR /mvcApp COPY ./out . ENTRYPOINT ["d ...
- Python全栈开发之1、输入输出与流程控制
Python简介 python是吉多·范罗苏姆发明的一种面向对象的脚本语言,可能有些人不知道面向对象和脚本具体是什么意思,但是对于一个初学者来说,现在并不需要明白.大家都知道,当下全栈工程师的概念很火 ...
- python中的计时器:timeit
python中的计时器:timeit timeit 通常在一段程序的前后都用上time.time(),然后进行相减就可以得到一段程序的运行时间,不过python提供了更强大的计时库:timeit #导 ...
- 使用 JavaScript 在下拉列表中获取选定的值
使用 JavaScript 在下拉列表中获取选定的值 演示Demo 使用 JavaScript 在下拉列表中获取选定的值? <!DOCTYPE html> <html> < ...