У меня есть хранимая функция, задача которой состоит в том, чтобы пройти и проанализировать много данных из нескольких таблиц. В то время как большинство таблиц статичны - и я могу объявлять курсоры для обработки данных - есть некоторые таблицы, которые заранее не известны, в частности, таблицы набора языков (например, language_en
, language_fr
и т. Д.), То есть на момент хранения функция написана, я не знаю, какая из этих таблиц будет присутствовать.Завершить результаты запроса готовой инструкции внутри хранимой процедуры
В самой сохраненной функции, я могу это сделать:
declare cLang cursor for
SELECT table_name FROM information_schema.tables
WHERE table_schema=database() and table_name like 'language_%';
declare continue handler for not found set exit_loop = true;
open cLang;
set exit_loop = false;
cLang_loop: loop
fetch cLang into str;
...
end loop;
Таким образом, я могу перебирает все языковые таблицы, содержащиеся в базе данных. Затем мне нужно получить данные от каждого из них и перевернуть его, делая мой анализ. Очевидно, я не могу объявить курсор для каждого из них, потому что я не знаю, какие таблицы есть. Я могу использовать подготовленные заявления:
fetch cLang into tableName;
set @stmt_text = concat("SELECT t_code, t_string FROM ", str);
prepare stmt from @stmt_text;
execute stmt using @scId;
Но теперь, как мне выполнить цикл по результатам этого запроса?
Опцион может быть динамическим курсором, см [MariaDB/MySQL: Курсоры для динамического SQL] (https://falseisnotnull.wordpress.com/2013/01/08/mariadbmysql-cursors- для-динамического SQL /). – wchiquito