【发布时间】:2018-05-08 22:25:21
【问题描述】:
我的查询应该在遍历表 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');
【问题讨论】:
-
我想说,“你为什么不直接做一个
JOIN?你也不需要PREPARE/EXECUTE,你可以在查询table_b时在表达式中使用你的局部变量。”但我推断你已经简化了这个问题,你真的在用@yyy做其他工作。所以我不知道您实际上要解决什么问题,因此无法提出解决方案。这似乎是XY Problem。 -
取决于天气@yyy 是一个特定的值或者它是否为空,我需要编写一个嵌套的 if 语句,它会给我想要的结果。我只需要将值存储在这个变量中。
-
非常感谢!!它工作得很好。 :)
标签: mysql stored-procedures cursor