MYSQL 使用存储过程,结合游标循环插入数据demo

183 阅读1分钟

创建游标

CLOSE释放游标使用的所有内部内存和资源,因此在每个游标不再需要时都应该关闭

CREATE PROCEDURE processdemo()
BEGIN
    DECLARE product_id CURSOR
    FOR 
    SELECT id from product;
  --打开和关闭游标
    OPEN product_id;
  CLOSE product_id;
END;

从游标中检索单个行(第一行)

CREATE PROCEDURE processProductName()
BEGIN   
  -- DECLARE local VARIABLES
  DECLARE p_name INT;   
    -- DECLARE the CURSOR
    DECLARE product_name CURSOR
    FOR
    SELECT productName from product;
    -- OPEN the CURSOR
    OPEN product_name;
    -- Get productName form product
    FETCH product_name INTO p_name;
    -- CLOSE the CURSOR
    CLOSE product_name;
END;

使用游标循环处理数据

CREATE PROCEDURE processdemo()
BEGIN

    #声明一个开关变量flag用于循环结束判断默认是true
    DECLARE flag INT DEFAULT TRUE;
  -- Declare local variables,用于存储产品信息中的价格和名称
    DECLARE p_price VARCHAR(45);
  DECLARE n_name  VARCHAR(100);

  #申明一个游标,名字叫liuma,因为游标指向的表内有两个字段,需要两个变量存储,所有得申明两个变量;
    DECLARE liuma CURSOR
    FOR
    SELECT price,productName FROM product;
    -- Create a table to store the results
    CREATE TABLE IF NOT EXISTS price_demo(
        id INT auto_increment PRIMARY KEY ,
        price VARCHAR(45),
        product_name VARCHAR(100)
    );

    -- Open the cursor
    OPEN liuma;

    -- Loop through all rows
    REPEAT
        -- Get product price
        FETCH liuma INTO p_price,n_name;
    -- Insert price into price_demo
        INSERT INTO price_demo(price,product_name)
        VALUES(p_price,n_name);
     -- End of loop
    UNTIL flag = FALSE 
    END repeat;
    -- Close the cursor 
    CLOSE liuma;
END;
-- 调用存储过程
call  processdemo;

-- 查看存储状态
show  PROCEDURE STATUS;

-- 查看创建过程
show CREATE PROCEDURE processdemo;

-- 调用结束删除存储过程
drop PROCEDURE IF EXISTS  processdemo

-- 查看结果
SELECT *from price_demo