Сценарий: у меня есть хранимая процедура, которая получает данные из таблицы на основе 2 входных данных: даты и строки (которая является именем столбца). Первая процедура вызывается из другой процедуры, которая использует курсор для циклического перемещения по строкам таблицы и передачи каждой строки в строку первой процедуры (имена столбцов, которые необходимо проверить). Мои данные для второй процедуры (которая вызывается напрямую) - это дата.
Проблема: моя первая процедура работает нормально, когда я вызываю ее самостоятельно. Моя вторая процедура выдает некоторые синтаксические ошибки, которые я не знаю, как исправить.
Obs: Я уже проверял некоторые другие ответы здесь на эту тему, такие как Использование курсора в цикле хранимой процедуры и Как я могу пройти по всем строкам таблицы? (MySQL). На самом деле моя вторая процедура теперь является модифицированной версией запроса, который я нашел на SE https://dba.stackexchange.com/questions/138549/mysql-loop-through-a-table-running-a-stored-procedure-on- каждый въезд
Проблема: в настоящее время код выдает ошибку в строке 5 в моем объявлении @colval.
Код:
-- 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 ;
Вопрос: есть идеи как это исправить?
У вас есть пара проблем в вашей процедуре. Во-первых, как описано в руководстве:
DECLARE разрешен только внутри составного оператора BEGIN... END и должен быть в начале, перед любыми другими операторами.
Так что вам нужно переместить
set @dateval = 'wanted_date';
после всего DECLARE
(включая курсор и обработчик продолжения).
Во-вторых, ваше объявление colval
неверно, string
не является допустимым типом данных и должна быть заменена text
:
declare colval text default null;
declare
должны находиться перед любым кодом, например,set @dateval =
wanted_date`;