Не удается создать подготовленные инструкции в MySQL

#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;