Несколько курсоров MySQL в процедуре


У меня возникли проблемы с моим кодом, когда я пытался понять, как работают процедуры и курсоры в MySQL. Я хотел бы сделать так, чтобы курсоры использовали и / или обновляли переменные, объявленные в коде, но корректно обновлялись только переменные var1 и var2.
Cursor2 должен возвращать только 1 результат, но вместо этого он возвращает только пустые строки, переменные var3 и var4 не обновляются - их значения, по-видимому, все еще являются значениями по умолчанию. То же самое для Cursor3 и переменной var4.

Настоящий код похож на этот:

DELIMITER //

CREATE PROCEDURE nameProcedure()

proc_label:BEGIN
DECLARE finished INTEGER DEFAULT 0;
DECLARE var1 VARCHAR(20) DEFAULT "";
DECLARE var2 VARCHAR(30) DEFAULT "";
DECLARE var3 INT(3) DEFAULT 0;
DECLARE var4 int(3) DEFAULT 0;

 // first cursor, gives multiple rows as results 
DECLARE cursor1 CURSOR FOR
SELECT column1, column2
FROM table1;

 // second cursor, should give only 1 row as result 
DECLARE cursor2 CURSOR FOR
SELECT column1, column2 
FROM table2
WHERE column1=var1 
AND column2=var2;

 // third cursor, should give only 1 row as result 
DECLARE cursor3 CURSOR FOR 
SELECT count(column3) 
FROM table3 
WHERE column1=var3;

 // HANDLER 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;

OPEN cursor1;
OPEN cursor2;
OPEN cursor3;

label: LOOP 

    FETCH cursor1 INTO var1, var2;

    IF finished=1 THEN LEAVE loop;
    END IF;

    FETCH cursor2 INTO var3, var4;

    IF finished=1 THEN LEAVE proc_label;
    END IF;

    FETCH cursor3 INTO var5;

    IF finished=1 THEN LEAVE proc_label;
    END IF;

    /* UPDATE some rows in tables using the values from var1, var2, var3, var4, var5 in WHERE clauses */

END LOOP loop;

CLOSE cursor1;

CLOSE cursor2;

CLOSE cursor3;

END//



Я прошу прощения за то, что написал в этом посте, английский - не мой родной язык, и я никогда не писал постов на форумах, поэтому я не уверен, как его отформатировать, чтобы сделать вопрос более понятным для людей. Предложения, исправления и т. д. Приветствуются.

Мне сложно понять, что вы здесь пытаетесь сделать ... Я советую вам прочитать Почему я должен предоставлять MCVE для того, что мне кажется очень простым запросом SQL? .. Кроме того, MySQL просто поддерживает UPDATE и присоединение, которое вы пытаетесь смоделировать здесь ... Что-то подобное возможно в MySQL UPDATE <...> INNER JOIN table ON <...> SET <...> WHERE <..>

Raymond Nijland 13.12.2018 19:26

Если вы измените значение переменной (например, var1), это не изменит результат вашего ранее определенного курсора 2, который использовал var1. Это не похоже на сценарий, который вызывается (и переоценивается), когда вы выбираете следующую строку. Кроме того: я согласен с Раймондом, не зная, что вы пытаетесь сделать, мы не можем это исправить / ответить. Но вы должны последовать его совету прочитать (а затем спросить) о join: реляционные базы данных имеют встроенную возможность комбинировать строки из разных таблиц; вам не нужно вручную извлекать строку 1, искать соответствующие данные в таблице 2, извлекать строку 2, ...

Solarflare 13.12.2018 20:08
Освоение архитектуры микросервисов с 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
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
2
1 378
0

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