关于Mysql存储过程及游标的说明书

    我和mysql存储过程、游标犹如“形同陌路”,不得不记录以便以后查看。

本文是阅读《mysql必知必会》的读书笔记,仅供参考:

1、CALL调用存储过程,后接存储过程名及所需参数。如:

    CALL ordertotal(20005, 1, @total);

    SELECT @total;

2、创建存储过程(应用程序中):

    DELIMITER //    #告诉命令行程序使用//做结束分割符,默认使用;做结束分割符

    CREATE PROCEDURE productpricing(#创建存储过程

    IN onumber INT,    # IN表示传递给存储过程

    IN taxable BOOLEAN,     # 数据类型和定义表结构数据类型相同

    OUT ototal DECIMAL(8,2)    # OUT表示传出结果(调用存储过程后,可以通过SELECT查询),INOUT表示既传入到存储过程也传出到结果

) COMMENT ‘Obtain order total, optionally adding tax’    # COMMENT结果将在SHOW PROCEDURE STATUS(显示存储过程详细内容)中显示

    BEGIN    # 标识存储过程开始

    — Declare variable for total    # “– 。。。”也表示注释

    DECLARE total DECIMAL(8,2);

    — Declare tax percentage

    DECLARE taxrate INT DEFAULT 6;

    — Get the order total    

    SELECT Sum(item_price*quantity)

    FROM orderitems

    WHERE order_num = onumber

    INTO total;    # INTO将查询结果赋值到total

    — Is this taxable

    IF taxable THEN    # IF语句开始,还有ELSEIF(配合THEN使用)、ELSE(不使用THEN)

    — Yes, so add taxrate to the total

    SELECT total+(total/100*taxrate) INTO total;

    END IF;    # IF语句结束

    — And finally, save to out variable

    SELECT total INTO ototal;

    END //    # 标识存储过程结束,并使用//做语句结束

    DELIMITER ;    # 恢复原语句分割符

3、查看存储过程:

    SHOW CREATE PROCEDURE 存储过程名    # 查看存储过程

    SHOW PROCEDURE STATUS LIKE ‘ordertotal’;    # 查看存储过程详细信息(何时、由谁创建等详细信息),可以使用过滤条件

4、使用游标:

    CREATE PROCEDURE processorders()

    BEGIN

    # 声明规则:变量声明在游标声明之前,CONTINUE HANDLER声明在游标声明之后

    — Declare local variables

    DECLARE done BOOLEAN DEFAULT 0;    # 声明结束标识符

    DECLARE o INT;

    DECLARE t DECIMAL(8,2);

    — Declare the cursor

    DECLARE ordernumbers CURSOR    # 声明游标,CURSOR表示游标,声明游标后必须打开使用,打开之后执行游标的SELECT操作,声明的时候不执行

    FOR

    SELECT order_num FROM orders;

    — Declare continue handler

    DECLARE CONTINUE HANDLER FOR SQLSTATE ‘02000’ SET done=1;        #CONTINUE HANDLER表示当达到一定条件后执行,SQLSTATE ‘02000’表示未找到下一行,达到一定条件执行的语句

    — Create a table to store the results

    CREATE TABLE IF NOT EXISTS ordertotals    # 不存在则创建表

    (order_num INT, total DECIMAL(8,2));

    — Open the cursor

    OPEN ordernumbers;    # 打开游标

    — Loop through all rows

    REPEAT    # 循环游标

    — Get order number

    FETCH ordernumbers INTO o;    # FETCH表示每一个游标结果

    — Get the total for this order

    CALL ordertotal(o, 1, t);    # 调用存储过程

    — Insert order and total into ordertotals

    INSERT INTO ordertotals(order_num, total)

    VALUES(o, t);    # 执行插入语句

    — End of loop

    UNTIL done END REPEAT;    # UNTIL表示达到一定条件后执行,END REPEAT表示结束循环

    — Close the cursor

    CLOSE ordernumbers;    # 关闭游标,如果没有关闭游标则在存储过程结束后自动关闭游标,游标只能应用到当前存储过程中

    END;

    原文作者:爱敷面膜的developer
    原文地址: https://www.jianshu.com/p/004a35614e09
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞