我和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;