Дополнительный бит, который вызвал у меня проблемы.
Я хотел задать имя таблицы и поле динамически в запросе, как и @kyle, но я также хотел сохранить результат этого запроса в переменной @a
внутри запроса.
Вместо того, чтобы помещать переменную @a
в concat
буквально, вам необходимо включить ее в текст строки.
delimiter //
CREATE PROCEDURE removeProcessed(table_name VARCHAR(255), keyField VARCHAR(255), maxId INT, num_rows INT)
BEGIN
SET @table_name = table_name;
SET @keyField = keyField;
SET @maxId = maxId;
SET @num_rows = num_rows;
SET @sql_text1 = concat('SELECT MIN(',@keyField,') INTO @a FROM ',@table_name);
PREPARE stmt1 FROM @sql_text1;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
loop_label: LOOP
SET @sql_text2 = concat('SELECT ',@keyField,' INTO @z FROM ',@table_name,' WHERE ',@keyField,' >= ',@a,' ORDER BY ',@keyField,' LIMIT ',@num_rows,',1');
PREPARE stmt2 FROM @sql_text2;
EXECUTE stmt2;
DEALLOCATE PREPARE stmt2;
...Additional looping code...
END LOOP;
END
//
delimiter ;
Таким образом, в @sql_text1
присвойте результат запроса @a
в строке, используя:
') INTO @a FROM '
Затем в @sql_text2
используйте @a
в качестве фактической переменной:
,' WHERE ',@keyField,' >= ',
@ а ,' ORDER BY '