mysql 存储过程 游标 游标嵌套
2019-03-20 本文已影响0人
AlanSun2
CREATE PROCEDURE `NewProc`(INOUT `eter` tinyint)
BEGIN
#Routine body goes here...
DECLARE fId int(11);
DECLARE subStatus int(1);
-- 遍历数据结束标志
DECLARE done INT DEFAULT FALSE;
DECLARE cursor_name CURSOR FOR (SELECT f_id from order_info where `status` is null);
DECLARE orderSub CURSOR FOR SELECT status from order_sub_info where f_id = fId;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cursor_name;
myloop: LOOP
-- 如果有多个返回值,则这里就跟多个变量,例如:FETCH cursor_name INTO fId orderId;
FETCH cursor_name INTO fId;
IF done THEN
LEAVE myloop;
END IF;
-- 这里做你想做的循环的事件
OPEN orderSub;
orderLoop: LOOP
FETCH orderSub INTO subStatus;
IF done THEN
LEAVE orderLoop;
END IF;
-- 这里做你想做的循环的事件
END LOOP orderLoop;
CLOSE orderSub;
-- 这里为什么要把 done 设置为 false?
-- 因为嵌套中的循环结束后 done = true,如果不设置为 false 会导致外层循环只执行一边
SET done = FALSE;
END Loop myloop;
CLOSE cursor_name;
END;;
如何把多列的查询结果设置到变量中?
示例:
CREATE DEFINER=`root`@`%` PROCEDURE `testddd`(IN inpa INT(11), OUT ida INT(11), OUT paradd VARCHAR(10), OUT df INT(11))
BEGIN
SELECT id, param1 INTO ida, paradd FROM test WHERE id = 2;
SET df = inpa;
END$$
在存储过程中我觉得不要使用用户变量,除非一后面要使用这个变量。
存储过程中的传参
传参可以使用 IN,OUT,INOUT。所有定义的参数(无论入参还是出参)都必须传,否则会报错。
IN:表示入参,可以是变量(可以传空)或固定值
OUT:表示出参,必须为一个定义的变量(一般使用用户变量(@开头定义的变量,同一个 session 有效))
INOUT:即可以做入参可以做出参