Использование курсора в хранимой процедуре для зацикливания строк MySQL

Сценарий: У меня есть хранимая процедура, которая получает данные из таблицы на основе двух входов: даты и строки (которая является именем столбца). Первая процедура вызывается из другой процедуры, которая с помощью курсора перебирает строки таблицы и передает каждую строку в строку первой процедуры (имена столбцов, которые необходимо проверить). Мой ввод для второй процедуры (которая вызывается напрямую) - это дата.

Проблема: Моя первая процедура работает нормально, когда я вызываю ее самостоятельно. Моя вторая процедура вызывает некоторые синтаксические ошибки, которые я не знаю, как исправить.

Наблюдения: Я уже проверял некоторые другие ответы здесь по этой теме такие как Использование курсора в цикле хранимой процедуры и Как я могу просмотреть все строки таблицы? (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 ;

Вопрос: Есть идеи, как это исправить?

Все операторы declare должны стоять перед любым кодом, например. set @dateval = wanted_date`;

Nick 27.11.2018 12:38

@Nick А что насчет курсора? На самом деле я просто передвинул утверждения. Та же ошибка.

DGMS89 27.11.2018 12:43

Из руководство: DECLARE разрешено только внутри составного оператора BEGIN ... END и должно быть в его начале перед любыми другими операторами.

Nick 27.11.2018 12:50

@Nick Я только что поменял свой набор на после всего заявленного. По-прежнему получаю ту же ошибку

DGMS89 27.11.2018 12:50

Ах да, это должен быть text, а не string

Nick 27.11.2018 12:52

@Nick Это решило. Большое спасибо.

DGMS89 27.11.2018 12:54
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
6
2 426
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть пара проблем с процедурой. Во-первых, как описано в руководство:

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;

Другие вопросы по теме