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

yzuktlbb  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(307)

场景:我有一个存储过程,它基于两个输入从表中获取数据:一个日期和一个字符串(这是一个列名)。第一个过程是从另一个过程调用的,该过程使用光标循环表中的行,并将每一行传递给第一个过程的字符串(要检查的列名)。我对第二个过程(即直接调用的过程)的输入是日期。
问题:当我自己调用它时,我的第一个过程运行良好。我的第二个过程是抛出一些语法错误,我不知道如何修复。
obs:我已经在这里检查了关于这个主题的一些其他答案,比如在存储过程的循环中使用游标,以及如何在表的所有行中循环(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 ;

问题:有什么办法解决这个问题吗?

siotufzp

siotufzp1#

你的手术有几个问题。首先,如手册所述:
只允许在begin中声明。。。结束复合语句,并且必须在其开始处,在任何其他语句之前。
所以你需要移动你的

set @dateval = `wanted_date`;

经历了这么多 DECLARE s(包括游标和continue处理程序)。
第二,你宣布 colval 不正确, string 不是有效的数据类型,应替换为 text :

declare colval text default null;

相关问题