У меня возникли проблемы с моим кодом, когда я пытался понять, как работают процедуры и курсоры в 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//
Я прошу прощения за то, что написал в этом посте, английский - не мой родной язык, и я никогда не писал постов на форумах, поэтому я не уверен, как его отформатировать, чтобы сделать вопрос более понятным для людей. Предложения, исправления и т. д. Приветствуются.
Если вы измените значение переменной (например, var1), это не изменит результат вашего ранее определенного курсора 2, который использовал var1. Это не похоже на сценарий, который вызывается (и переоценивается), когда вы выбираете следующую строку. Кроме того: я согласен с Раймондом, не зная, что вы пытаетесь сделать, мы не можем это исправить / ответить. Но вы должны последовать его совету прочитать (а затем спросить) о join: реляционные базы данных имеют встроенную возможность комбинировать строки из разных таблиц; вам не нужно вручную извлекать строку 1, искать соответствующие данные в таблице 2, извлекать строку 2, ...






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