#mysql #prepared-statement
#mysql #подготовленное заявление
Вопрос:
Я пытаюсь создать подготовленную инструкцию в MySQL, которая принимает один параметр. Когда я пытаюсь это сделать в командной строке, я получаю синтаксическую ошибку. Однако, когда в моей подготовленной инструкции нет переменных, я могу создать их нормально. Ниже приведена копия и вставка того, что я вижу в командной строке MySQL:
mysql> PREPARE state_name FROM "select * from ? limit 1";
ОШИБКА 1064 (42000): у вас ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с ‘? limit 1’ в строке 1
mysql> PREPARE state_name FROM "select * from documents limit 1";
Запрос в порядке, затронуты 0 строк (0.00 сек) Подготовленная инструкция
Версия MySQL, которую я использую, — 5.0.77-log.
Есть ли синтаксическая ошибка, которую я не вижу? И есть ли какие-либо параметры конфигурации, которые я должен установить, чтобы заставить подготовленные инструкции работать?
Ответ №1:
Боюсь, вы не можете передавать имена таблиц в качестве параметров подготовленной инструкции, равно как и столбцы для группировки или сортировки. Единственное, что вы можете параметризовать, это поля в предложениях where или для обновлений:
PREPARE state_name FROM "select * from documents where id = ?";
PREPARE state_name FROM "update documents set field = ? where id = ?";
Ответ №2:
Если вы хотите создать одну инструкцию prepare и использовать ее более чем для одной таблицы, вы можете фактически создать переменную для каждой таблицы, а затем создать инструкцию, используя эту переменную, как это объясняется в руководстве по MySQL :
mysql> USE test;
mysql> CREATE TABLE t1 (a INT NOT NULL);
mysql> INSERT INTO t1 VALUES (4), (8), (11), (32), (80);
mysql> SET @table = 't1';
mysql> SET @s = CONCAT('SELECT * FROM ', @table);
mysql> PREPARE stmt3 FROM @s;
mysql> EXECUTE stmt3;
----
| a |
----
| 4 |
| 8 |
| 11 |
| 32 |
| 80 |
----
mysql> DEALLOCATE PREPARE stmt3;