Динамический MySQL с локальными переменными

Как я могу использовать динамические операторы 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. Есть какой-либо способ сделать это?


person ssobczak    schedule 24.09.2009    source источник


Ответы (1)


Извините, подготовленные операторы в 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.

person Justin Grant    schedule 25.09.2009