欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

玩转MySQL存储过程:深入理解游标与游标嵌套

最编程 2024-08-05 08:28:38
...
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:即可以做入参可以做出参