存储过程使用游标循环并将返回值存储到变量中

时间:2018-05-08 22:25:21

标签: mysql stored-procedures cursor

我的查询应该在循环访问表table_a的游标时检查table_b中是否存在值。如果table_b中存在一个值,则将值返回到变量@yyy 当我运行这个存储过程时,我应该得到一个返回col2,col3,col1的值。但它只返回col2,col3 在此查询中,当我使用into @yyy时,我觉得它无法正常工作。不确定是什么问题。能帮忙吗 只需删除into @yyy即可获得正确的结果,但我需要对变量@yyy进行更多更改,这就是我需要将结果存储到其中的原因。

Delimiter $$
DROP PROCEDURE IF EXISTS sp_test3;
CREATE PROCEDURE sp_test3()
BEGIN
DECLARE DONE INT DEFAULT 0;
DECLARE col1 varchar(255);
DECLARE curA CURSOR FOR SELECT  a1 FROM table_a;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = 1;
OPEN curA;
SET @SQL_TXT = '';
while done = 0 do  
fetch next from CurA into col1;
if done = 0 then
SET @xxx = CONCAT("select b1 into @yyy  from table_b where b1 ='", 
col1,"'");
PREPARE stmt_name FROM @xxx;
EXECUTE stmt_name;
DEALLOCATE PREPARE stmt_name;
SELECT  @yyy;
END IF;
END WHILE;
close curA;
end
$$  

在下面创建表脚本:

      create table table_a(a1 varchar(255));      
      create table table_b(b1 varchar(255));    

      insert into table_a values('col2');
      insert into table_a values('col3');
      insert into table_a values('col5');
      insert into table_a values('col1');

      insert into table_b values('col2');
      insert into table_b values('col3');
      insert into table_b values('col4');
      insert into table_b values('col1');

1 个答案:

答案 0 :(得分:0)

drop procedure if exists sp_test3;
drop table if exists table_b, table_a;

create table if not exists table_a(a1 varchar(255));
create table if not exists table_b(b1 varchar(255));

insert into table_a values ('col2');
insert into table_a values ('col3');
insert into table_a values ('col5');
insert into table_a values ('col1');

insert into table_b values ('col2');
insert into table_b values ('col3');
insert into table_b values ('col4');
insert into table_b values ('col1');

 CREATE PROCEDURE sp_test3()
 BEGIN
 DECLARE DONE, DONE1 INT DEFAULT 0;
 DECLARE col1 varchar(255);
 DECLARE curA CURSOR FOR SELECT a1 FROM table_a;
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = 1;
 OPEN curA;
 SET @SQL_TXT = '';
    while done = 0 do  
     fetch next from CurA into col1;
     if done = 0 then
     BEGIN
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE1 = 1;
     SET @xxx = CONCAT("select b1 into @yyy 
                       from table_b
                       where b1 = '", col1, "'");
     PREPARE stmt_name FROM @xxx;
     EXECUTE stmt_name;
     DEALLOCATE PREPARE stmt_name;
     if (DONE1 = 0) THEN
       SELECT @yyy;
     ELSE
       SET DONE1 = 0;
     END IF;
     END;
     END IF;
   END WHILE;
  close curA;
 end;