Динамический MySQL с локальными переменными
-
16-09-2019 - |
Вопрос
Как я могу использовать динамические операторы SQL в базе данных MySQL без использования переменных сеанса?
Прямо сейчас у меня есть такой код (в хранимой процедуре MySQL):
(...) DECLARE TableName VARCHAR(32); SET @SelectedId = NULL; SET @s := CONCAT("SELECT Id INTO @SelectedId FROM ", TableName, " WHERE param=val LIMIT 1"); PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt; IF ISNULL(@SelectedId) THEN (...)
Но я хотел бы использовать только локальные переменные, это означает, что я хотел бы начать эту процедуру с:
DECLARE TableName VARCHAR(32); DECLARE s VARCHAR(1024); DECLARE SelectedId INTEGER UNSIGNED; (...)
и нигде не используйте @char.Есть какой-либо способ сделать это?
Решение
Извините, подготовленные операторы в MySQL являются глобальными для сеанса.В соответствии с http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html, «Подготовленное заявление также является глобальным для сеанса».
И нет другого способа (кроме подготовленных операторов) выполнить динамический SQL в MySQL 5.x.
Итак, вы, конечно, можете заменить «@s» выше, но AFAIK вы застряли на @SelectedId.
В MySQL 6.x запланирована функция, которая добавит оператор EXECUTE IMMEDIATE, который будет выполнять динамический SQL.Видеть http://forge.mysql.com/worklog/task.php?id=2793.