方案::我有一个存储过程,该存储过程基于2个输入从表中获取数据:日期和字符串(这是列名)。从另一个过程调用第一个过程,该过程使用游标在表的行中循环,并将每一行传递到第一个过程的字符串(要检查的列名)。我在第二个过程(直接调用的过程)中输入的是日期。
问题:我自己调用它的第一个过程运行良好。我的第二个步骤是抛出一些我不知道如何解决的语法错误。
糟糕:我已经在此处查看了有关此主题的其他答案 例如Using Cursor in a Loop of a stored procedure和How 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 ;
问题:有关如何解决此问题的任何想法?
答案 0 :(得分:1)
您的程序中有几个问题。首先,如manual中所述:
DECLARE仅在BEGIN ... END复合语句中允许使用,并且必须在其开头,在任何其他语句之前。
所以您需要移动
set @dateval = `wanted_date`;
在所有DECLARE
之后(包括光标和继续处理程序)。
第二,您对colval
的声明不正确,string
不是有效的数据类型,应将其替换为text
:
declare colval text default null;