mysql - 带 while 循环的嵌套游标

标签 mysql stored-procedures cursors

我想用while循环编写一个嵌套游标,这样当Table_A的column_name与Table_B的col1匹配时,我就可以从table_B获取结果。
如果从 Table_B 中选择 col1、col2、col3,其中 col1 = tblA_col1 为 null,则转到下一行并返回 col1。
我需要将列结果保存在变量中。

  Delimiter $$
  DROP PROCEDURE IF EXISTS sp_test;
  CREATE PROCEDURE sp_test() 
  begin 
    DECLARE done, done1 int DEFAULT 0; 
    DECLARE tblA_col1 varchar(255); 
    DECLARE tblB_col1 varchar(255);
    DECLARE tblB_col2 varchar(255);
    DECLARE tblB_col3 varchar(255);
      DECLARE curA CURSOR FOR   SELECT column_name   FROM   Table_A; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 
    open curA; 

      WHILE (done = 0) do
      FETCH next   FROM  curA   INTO  tblA_col1;
     DECLARE curB CURSOR FOR   select col1, col2, col3 from Table_B where col1 = tblA_col1;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done1 = 1; 
      open curB;
    Fetch next from curB into tblB_col1,tblB_col2,tblB_col3;
    select tblB_col1;
   select tblB_col2;
    select tblB_col3;
    close curB;
  if tblB_col1 is null then 
  tblB_col1 = tblB_col1;
  end if;

    end while;
    close curA;
    end;
    $$
  --  call sp_test

我是游标新手,在使用嵌套 curB 时遇到问题。你能帮忙吗?

最佳答案

我注意到的唯一明显的语法问题是循环中的 DECLARES。

DECLARE is permitted only inside a BEGIN ... END compound statement and must be at its start, before any other statements.

https://dev.mysql.com/doc/refman/8.0/en/declare.html

如果您在第一次获取后放置一个 BEGIN,并在关闭 curB 后放置一个 END,那么您没有完全指定的问题可能会得到解决。您可能还需要在每个外部迭代中重置done1(我不记得它是否会保留先前迭代的值。)

关于mysql - 带 while 循环的嵌套游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50281661/

相关文章:

php - mysql从同一列中的不同行中减去

c# - 我的游戏在线高分

MySQL死锁与存储过程生成UID

sql-server - 解决游标问题

database - 游标与重复代码/逻辑

php - 从 Zend 中的表中选择完全匹配的列...?

PHP LIKE QUERY 返回 0 条数据

MySql 存储过程通过命令在使用 select 语句时不同步而没有结果

c# - 如何在 C# 中使用存储过程返回结果列表?

android - 您想在您的 Android 应用程序中集成基于 POJO 或 Cursor 的库吗?