SQL基本语句(以MySQL为例)-- 第五部分

19、使用存储过程
MySQL的存储过程的语句跟这本书上的差太远了吧,以下参考自:MySQL存储过程教程

DELIMITER //  -- 先把分隔符“;”换成“//”,以免非预期的语句结束
CREATE PROCEDURE mailing_list_count(
    OUT list_count INT
    -- OUT表示该参数用来返回值
    -- IN表示用来传递值
    -- INOUT更多查看上面的参考
)
BEGIN
    DECLARE v_rows INT;
    SELECT COUNT(*) INTO v_rows
    FROM customers
    WHERE NOT cust_email IS NULL;
    SET list_count = v_rows;
END//  -- 这里才是这整个CREATE PROCEDURE语句的结束
DELIMITER ;  -- 恢复分隔符为“;”,注意有个空格
CALL mailing_list_count(@count);  -- 调用存储过程
SELECT @count;  --查看count的值

20、管理事务处理
事务处理用来确保一连串相关的表操作,能够全部执行完毕,如果其中某步骤出错,则进行回滚。
比如1个新顾客,下了1个订单,其中有2个商品,将涉及到3个表的操作。
可以撤销的操作:INSERT、UPDATE、DELETE,不能撤销的操作:SELECT、CREATE、DROP。
嗯,,,这个书上的例子,完全不能用在MySQL中

BEGIN;  -- 或者START TRANSACTION;
DELETE FROM orders WHERE order_num = 343242;
COMMIT;  -- 在执行COMMIT前,都可以用ROLLBACK撤销之前的所有操作
-- 带保留点的回滚
BEGIN;
DELETE FROM orders WHERE order_num = 123;
SAVEPOINT delete1;
DELETE FROM orders WHERE order_num = 1212;
DELETE FROM orders WHERE order_num = 231;
ROLLBACK TO delete1;  -- 只撤销SAVEPOINT delete1这句(保留点)之后的语句

21、使用游标
这里由于书上的例子完全不太适用于MySQL,所以参考:《MySQL必知必会》
首先MySQL中的游标只能在存储过程中,然后是只读,只能往一个方向移动,不能跳行

先定义另一个要用到的存储过程

DELIMITER //
CREATE PROCEDURE OrderTotal(
    IN ONumber INT,
    OUT OTotal DECIMAL(8, 2)
)
BEGIN
    SELECT SUM(item_price * quantity)
    FROM orderitems
    WHERE order_num = ONumber
    INTO OTotal;
END//
DELIMITER ;

循环使用游标,如果不用循环的话,相当于只读取了第一行

DELIMITER //
CREATE PROCEDURE ProcessOrders()
BEGIN
    -- 定义局部变量
    DECLARE done BOOLEAN DEFAULT 0;
    DECLARE o INT;
    DECLARE t DECIMAL(8, 2);

    -- 定义游标
    DECLARE OrderNumbers CURSOR
    FOR
    SELECT order_num FROM orders;

    -- 定义CONTINUE HANDLER
    -- SQLSTATE '02000'是一个未找到条件,当REPEAT由于没有更多的行供循环而不能继续时,出现这个条件。
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

    -- 创建一个新表用来存储数据,如果该表不存在的话
    CREATE TABLE IF NOT EXISTS ordertotals(
        order_num INT, total DECIMAL(8, 2)
    );
    
    OPEN OrderNumbers;
    REPEAT
        -- 读取一行,下一次将读取下一行
        FETCH OrderNumbers INTO o;
        CALL OrderTotal(o, t);  -- 调用前面的存储过程,返回总价,存储在变量t中
        INSERT INTO ordertotals(order_num, total)
        VALUES(o, t);
    UNTIL done END REPEAT;
    CLOSE OrderNumbers;
END//
DELIMITER ;

调用存储过程,会在表ordertotals(如果不存在,则先创建)中插入,每个订单的总价值

CALL ProcessOrders();
SELECT * FROM ordertotals;
-- 输出,这里为什么会有2个20008?没搞清楚,,
+-----------+---------+
| order_num | total   |
+-----------+---------+
|     20005 | 1648.00 |
|     20009 | 1867.50 |
|     20006 |  329.60 |
|     20007 | 1696.00 |
|     20008 |  189.60 |
|     20008 |  189.60 |
+-----------+---------+

《SQL必知必会》最后一章就直接过目一下了,之后再来扫一遍《MySQL必知必会》当作加深记忆,因为现在根本用不到,所以就多看一遍,不然很快就忘了

参考:SQL必知必会(第四版)
参考:MySQL必知必会

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容

  • 《MySQL必知必会》学习笔记 目录 https://www.jianshu.com/p/97bab08c6755...
    leacoder阅读 564评论 0 1
  • 前言 读《sql必知必会 第四版》随手做的笔记,写的比较乱,可读性并不好,读的是中文版,翻译过来的感觉有点怪怪的。...
    _老徐_阅读 626评论 0 0
  • Mysql 快速指南 本文的示例在 Mysql 5.7 下都可以测试通过。 知识点 概念 SQL 基础 增删改查 ...
    静默虚空阅读 738评论 0 2
  • 语 句 功 能 数据操作 SELECT——从数据库表中检索数据行和列INSERT——向数据库表添加新数据行DELE...
    戰敭阅读 5,079评论 0 53
  • 子查询 子查询是嵌套在其他查询里的查询,比如下面的例子 子查询可以应用在任何需要其结果的地方,比如在其之上进一步筛...
    Eu写字的地方阅读 936评论 0 0