在存储过程中使用游标来循环行MySQL

时间:2018-11-27 11:31:22

标签: mysql sql loops stored-procedures cursor

方案::我有一个存储过程,该存储过程基于2个输入从表中获取数据:日期和字符串(这是列名)。从另一个过程调用第一个过程,该过程使用游标在表的行中循环,并将每一行传递到第一个过程的字符串(要检查的列名)。我在第二个过程(直接调用的过程)中输入的是日期。

问题:我自己调用它的第一个过程运行良好。我的第二个步骤是抛出一些我不知道如何解决的语法错误。

糟糕:我已经在此处查看了有关此主题的其他答案 例如Using Cursor in a Loop of a stored procedureHow can I loop through all rows of a table? (MySQL)。实际上,我的第二个过程现在是我在SE https://dba.stackexchange.com/questions/138549/mysql-loop-through-a-table-running-a-stored-procedure-on-each-entry

上找到的查询的修改版本

问题:当前,代码在我声明为@colval的第5行抛出错误。

代码:

-- Procedure for looping through rows of `wanted_columns` table:
delimiter $$
drop procedure if exists `data_check_loop` $$
create procedure `data_check_loop`(`wanted_date` date)
begin

set @dateval = `wanted_date`;
declare colval string default null;

-- boolean variable to indicate cursor is out of data
declare done tinyint default false;

-- declare a cursor to select the desired columns from the desired source table
declare cursor1
    cursor for
        select t1.c1
        from `wanted_columns` t1; 

-- catch exceptions
        declare continue handler for not found set done = true;

-- open the cursor
        open cursor1;
            my_loop: 
            loop
                fetch next from cursor1 into colval;
                if done then 
                    leave my_loop; 
                else  
                    call `set_column_stats`(colval, dateval);
                end if;
            end loop;
        close cursor1;

end $$
delimiter ;

问题:有关如何解决此问题的任何想法?

1 个答案:

答案 0 :(得分:1)

您的程序中有几个问题。首先,如manual中所述:

  

DECLARE仅在BEGIN ... END复合语句中允许使用,并且必须在其开头,在任何其他语句之前。

所以您需要移动

set @dateval = `wanted_date`;

在所有DECLARE之后(包括光标和继续处理程序)。

第二,您对colval的声明不正确,string不是有效的数据类型,应将其替换为text

declare colval text default null;