stored-procedures - MYSQL | | 游标将游标提取到变量返回 null

  显示原文与译文双语对照的内容
0 0

我想:

  1. 创建临时表。
  2. 将部分数据插入临时表。
  3. 在 temporary.user_id 字段中运行循环。
  4. 在数据操作和计算后更新每一行。

步骤 #3, 上的问题:从游标中得到user_id=NULL而不是整数。


CREATE PROCEDURE user_demo_sp()
BEGIN
 DECLARE done INT DEFAULT FALSE;
 DECLARE current_user INT;
 DECLARE cur CURSOR FOR SELECT user_id FROM users_temp; -- Cursor on temp table 
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

-- Create a table
DROP temporary table if exists `users_temp` ;
CREATE temporary table `users_temp` (
user_id INT(11) NOT NULL,
aggregation_column INT(11) NOT NULL
);

-- Fill table
INSERT INTO users_temp SELECT user_id from users where condition ="condition";

 OPEN cur;

 read_loop: LOOP
 FETCH cur INTO current_user;
 IF done THEN
 LEAVE read_loop;
 END IF;
 select current_user; -- Return NULL

 END LOOP;

 CLOSE cur;

END;

时间: 原作者:

0 0

在将临时表声明为( 只使用嵌套的开始。结束块) 之前,你需要填充临时表:


CREATE PROCEDURE user_demo_sp()
BEGIN
 DECLARE done INT DEFAULT FALSE;
 DECLARE current_user INT;
 temp table 
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

-- Create a table
DROP temporary table if exists `users_temp` ;
CREATE temporary table `users_temp` (
user_id INT(11) NOT NULL,
aggregation_column INT(11) NOT NULL
);

-- Fill table
INSERT INTO users_temp SELECT user_id from users where condition ="condition";
 Begin
 DECLARE cur CURSOR FOR SELECT user_id FROM users_temp; -- Cursor on
 OPEN cur;

 read_loop: LOOP
 FETCH cur INTO current_user;
 IF done THEN
 LEAVE read_loop;
 END IF;
 select current_user; -- Return NULL

 END LOOP;

 CLOSE cur;
 End;
END;

在这样的场景中,你不需要一个临时表,你可以在所用的选择中声明光标。

原作者:
...