Mysql游标在存储过程中没有返回任何内容

时间:2014-03-13 07:04:33

标签: mysql stored-procedures cursor

我正在尝试在MySQL Workbench中的存储过程中使用游标。 代码如下所示:

DELIMITER $$

DROP PROCEDURE IF EXISTS order_procedure$$
CREATE PROCEDURE order_procedure()
BEGIN

DECLARE id INT;
DECLARE flag INT DEFAULT 0;

DECLARE ordercursor CURSOR FOR 
SELECT id FROM wp_posts
WHERE wp_posts.post_type = 'shop_order';

DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag = 1;

OPEN ordercursor;

get_orders:LOOP
FETCH NEXT FROM ordercursor INTO id;
IF flag = 1 THEN 
    LEAVE get_orders;
END IF;

SELECT * FROM wp_woocommerce_order_items oi
INNER JOIN wp_woocommerce_order_itemmeta oim ON oim.order_item_id = oi.order_item_id
WHERE oi.order_id = id;

END LOOP;
CLOSE ordercursor; 
END$$
DELIMITER ;

如果我尝试:

SELECT id FROM wp_posts
WHERE wp_posts.post_type = 'shop_order'; 

我得到了我想要的结果,即。包含order_ids的15行,但是当我CALL order_procedure();时,我什么都没得到。

当我尝试打印ID时,我得到NULL。 我错过了什么?

编辑:添加了显示光标使用的SELECT的屏幕截图。 mysql

2 个答案:

答案 0 :(得分:0)

首先创建一个表" mytable"根据所需的列,无论您希望从此过程中获得什么,然后在下面的过程中更改字段名称并检查。

DELIMITER $$

DROP PROCEDURE IF EXISTS order_procedure$$
CREATE PROCEDURE order_procedure()
BEGIN

DECLARE _id INT;
DECLARE flag INT DEFAULT 0;

DECLARE ordercursor CURSOR FOR SELECT id FROM wp_posts WHERE wp_posts.post_type = 'shop_order';

DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag = 1;

OPEN ordercursor;
BEGIN
REPEAT
FETCH ordercursor INTO _id;
IF _id = '' THEN
    SET flag = 1;
END IF; 

        IF (flag<>1) THEN
    SET @str1=CONCAT("insert into mytable SELECT oi.field1,oi.field2,oim.field1 FROM wp_woocommerce_order_items oi INNER JOIN wp_woocommerce_order_itemmeta oim ON oim.order_item_id = oi.order_item_id WHERE oi.order_id ='",_id,"'");
            PREPARE stmt1 FROM @str1;
            EXECUTE stmt1;
            DEALLOCATE PREPARE stmt1;

               END IF;
UNTIL flag
END REPEAT;
END;
CLOSE ordercursor; 
SELECT * FROM mytable;
END$$
DELIMITER ;

答案 1 :(得分:0)

考虑到评论部分中的建议被证明是答案,即使在任何联合表中都没有名为id的列,我想我必须回答这个问题是否有其他人有同样的问题。

所以,答案是不要将变量id命名为v_id,或者真正想到的东西。 :)