Сценарий: У меня есть хранимая процедура, которая получает данные из таблицы на основе двух входов: даты и строки (которая является именем столбца). Первая процедура вызывается из другой процедуры, которая с помощью курсора перебирает строки таблицы и передает каждую строку в строку первой процедуры (имена столбцов, которые необходимо проверить). Мой ввод для второй процедуры (которая вызывается напрямую) - это дата.
Проблема: Моя первая процедура работает нормально, когда я вызываю ее самостоятельно. Моя вторая процедура вызывает некоторые синтаксические ошибки, которые я не знаю, как исправить.
Наблюдения: Я уже проверял некоторые другие ответы здесь по этой теме такие как Использование курсора в цикле хранимой процедуры и Как я могу просмотреть все строки таблицы? (MySQL). На самом деле моя вторая процедура теперь является модифицированной версией запроса, который я нашел на SE https://dba.stackexchange.com/questions/138549/mysql-loop-through-a-table-running-a-stored-procedure-on-each-entry.
Проблема: В настоящее время код выдает ошибку в строке 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 ;
Вопрос: Есть идеи, как это исправить?
@Nick А что насчет курсора? На самом деле я просто передвинул утверждения. Та же ошибка.
Из руководство: DECLARE разрешено только внутри составного оператора BEGIN ... END и должно быть в его начале перед любыми другими операторами.
@Nick Я только что поменял свой набор на после всего заявленного. По-прежнему получаю ту же ошибку
Ах да, это должен быть text, а не string
@Nick Это решило. Большое спасибо.






У вас есть пара проблем с процедурой. Во-первых, как описано в руководство:
DECLARE is permitted only inside a BEGIN ... END compound statement and must be at its start, before any other statements.
Итак, вам нужно переместить
set @dateval = `wanted_date`;
после всех DECLARE (включая курсор и обработчик продолжения).
Во-вторых, ваше объявление colval неверно, string не является допустимым типом данных и его следует заменить на text:
declare colval text default null;
Все операторы
declareдолжны стоять перед любым кодом, например.set @dateval =wanted_date`;