mysql存储过程 游标 循环使用介绍


在MySQL中,存储过程是一种在数据库中保存的一组为了完成特定功能的SQL语句集。游标(Cursor)在存储过程中经常被用来逐行处理查询结果集中的数据。结合循环结构,游标可以实现对结果集的遍历。下面我将简要介绍如何在MySQL存储过程中使用游标和循环。

### 1. 创建游标

首先,在存储过程中你需要声明一个游标,并指定它要遍历的SELECT语句。


DECLARE cursor_name CURSOR FOR 
    SELECT column1, column2
    FROM your_table
    WHERE some_condition;

### 2. 声明变量

为了接收游标遍历过程中的每一行数据,你需要声明与SELECT语句列相对应的变量。


DECLARE var_column1 datatype;
DECLARE var_column2 datatype;
-- 假设column1是INT类型,column2是VARCHAR类型
DECLARE var_column1 INT;
DECLARE var_column2 VARCHAR(100);

### 3. 异常处理(可选)

当游标遍历完所有行后,继续获取数据将会引发一个异常。你可以声明一个处理程序来捕获这个异常。


DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

其中`done`是一个布尔变量,用于在循环中控制是否继续。

### 4. 使用循环遍历游标

在MySQL中,通常使用`LOOP`、`REPEAT`或`WHILE`循环来遍历游标。这里以`WHILE`循环为例。


OPEN cursor_name;

read_loop: LOOP
    FETCH cursor_name INTO var_column1, var_column2;
    IF done THEN
        LEAVE read_loop;
    END IF;
    -- 在这里处理每一行数据,例如:
    -- INSERT INTO another_table (column1, column2) VALUES (var_column1, var_column2);
END LOOP;

CLOSE cursor_name;

### 完整示例

将上述步骤组合成一个完整的存储过程示例:


DELIMITER $$

CREATE PROCEDURE ProcessData()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE var_column1 INT;
    DECLARE var_column2 VARCHAR(100);
    DECLARE cursor_name CURSOR FOR 
        SELECT column1, column2
        FROM your_table
        WHERE some_condition;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cursor_name;

    read_loop: LOOP
        FETCH cursor_name INTO var_column1, var_column2;
        IF done THEN
            LEAVE read_loop;
        END IF;
        -- 处理数据
        INSERT INTO another_table (column1, column2) VALUES (var_column1, var_column2);
    END LOOP;

    CLOSE cursor_name;
END$$

DELIMITER ;

在这个示例中,我们创建了一个名为`ProcessData`的存储过程,它遍历`your_table`表中满足`some_condition`条件的行,并将每一行的`column1`和`column2`插入到`another_table`表中。注意,你需要根据自己的实际情况替换表名和列名。