Spec-Zone .ru
спецификации, руководства, описания, API
|
MySQL 5.7 оказывает поддержку для стороны сервера подготовленные операторы. Эта поддержка использует в своих интересах эффективный клиент-серверный протокол двоичной синхронной передачи данных, доступный начиная с MySQL 4.1. Используя готовые операторы с заполнителями для параметра значения обладает следующими преимуществами:
Меньше издержек для того, чтобы проанализировать оператор каждый раз это
выполняется. Как правило, приложения базы данных обрабатывают большие объемы почти идентичных операторов
с только изменениями к литеральным значениям или значениям переменных в пунктах такой как WHERE
для запросов и удаляет, SET
для
обновлений, и VALUES
для вставок.
Защита от атак с использованием кода на SQL. Значения параметра могут содержать неоставленные символы кавычек SQL и символы-разделители.
Можно использовать сторону сервера подготовленные операторы через клиентские интерфейсы программирования,
включая клиентскую библиотеку API
MySQL C или MySQL,
Connector/C для программ C, MySQL, Connector/J для программ Java,
и MySQL,
Connector/Net для программ, используя технологии.NET. Например, API C обеспечивает ряд вызовов функции,
которые составляют его готовый API оператора. См. Раздел 21.8.8,
"API C Готовые Операторы". Другие интерфейсы языка могут оказать поддержку для готовых
операторов, которые используют протокол двоичной синхронной передачи данных, соединяясь в клиентской библиотеке
C, один пример, являющийся mysqli
расширение
Альтернативный интерфейс SQL к готовым операторам доступен. Этот интерфейс не столь же эффективен как использование протокола двоичной синхронной передачи данных через готовый API оператора, но не требует никакого программирования, потому что это доступно непосредственно на уровне SQL:
Можно использовать это, когда никакой интерфейс программирования не доступен Вам.
Можно использовать это из любой программы, которая может отправить SQL-операторы серверу, который будет выполняться, такие как mysql клиентская программа.
Можно использовать это, даже если клиент использует старую версию клиентской библиотеки, пока Вы соединяете с сервером рабочий MySQL 4.1 или выше.
Синтаксис SQL для готовых операторов предназначается, чтобы использоваться для ситуаций, таких как они:
Протестировать, как готовые операторы работают в Вашем приложении прежде, чем кодировать это.
Использовать подготовленные операторы, когда у Вас нет доступа к API программирования, который поддерживает их.
В интерактивном режиме диагностировать проблемы приложения с готовыми операторами.
Создать прецедент, который воспроизводит проблему с готовыми операторами, так, чтобы можно было зарегистрировать отчет об ошибках.
PREPARE
, EXECUTE
, и DEALLOCATE PREPARE
ОператорыСинтаксис SQL для готовых операторов основан на трех SQL-операторах:
PREPARE
готовит оператор к выполнению (см. Раздел
13.5.1,"PREPARE
Синтаксис").
EXECUTE
выполняет готовый оператор (см. Раздел
13.5.2,"EXECUTE
Синтаксис").
DEALLOCATE
PREPARE
опубликовывает готовое заявление (см. Раздел
13.5.3,"DEALLOCATE PREPARE
Синтаксис").
Следующие примеры показывают два эквивалентных способа подготовить оператор, который вычисляет гипотенузу треугольника, данного длины этих двух сторон.
Первый пример показывает, как создать готовый оператор при использовании строкового литерала, чтобы предоставить текст оператора:
mysql>PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql>SET @a = 3;
mysql>SET @b = 4;
mysql>EXECUTE stmt1 USING @a, @b;
+------------+| hypotenuse |+------------+| 5 |+------------+mysql>DEALLOCATE PREPARE stmt1;
Второй пример подобен, но предоставляет текст оператора как пользовательская переменная:
mysql>SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql>PREPARE stmt2 FROM @s;
mysql>SET @a = 6;
mysql>SET @b = 8;
mysql>EXECUTE stmt2 USING @a, @b;
+------------+| hypotenuse |+------------+| 10 |+------------+mysql>DEALLOCATE PREPARE stmt2;
Вот дополнительный пример, который демонстрирует, как выбрать таблицу, на которой можно выполнить запрос во времени выполнения, храня имя таблицы как пользовательская переменная:
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;
Готовый оператор является определенным для сеанса, в котором он создавался. Если Вы завершаете сеанс, не освобождая ранее готовый оператор, сервер освобождает это автоматически.
Готовый оператор является также глобальной переменной к сеансу. Если Вы создаете готовый оператор в пределах сохраненной подпрограммы, это не освобождается, когда сохраненная подпрограмма заканчивается.
Чтобы принять меры против слишком многих готовых операторов, создаваемых одновременно, установите max_prepared_stmt_count
системная переменная. Чтобы предотвратить использование готовых операторов, установите значение в 0.
Следующие SQL-операторы могут использоваться в качестве подготовленных операторов:
ALTER TABLEALTER USERANALYZE TABLECACHE INDEXCALLCHANGE MASTERCHECKSUM {TABLE | TABLES}COMMIT{CREATE | DROP} INDEX{CREATE | RENAME | DROP} DATABASE{CREATE | DROP} TABLE{CREATE | RENAME | DROP} USERDELETEDOFLUSH {TABLE | TABLES | TABLES WITH READ LOCK | HOSTS | PRIVILEGES | LOGS | STATUS | MASTER | SLAVE | DES_KEY_FILE | USER_RESOURCES}GRANTINSERTINSTALL PLUGINKILLLOAD INDEX INTO CACHEOPTIMIZE TABLERENAME TABLEREPAIR TABLEREPLACERESET {MASTER | SLAVE | QUERY CACHE}REVOKESELECTSETSHOW {AUTHORS | CONTRIBUTORS | WARNINGS | ERRORS}SHOW BINLOG EVENTSSHOW CREATE {PROCEDURE | FUNCTION | EVENT | TABLE | VIEW}SHOW {MASTER | BINARY} LOGSSHOW {MASTER | SLAVE} STATUSSLAVE {START | STOP}TRUNCATE TABLEUNINSTALL PLUGINUPDATE
Другие операторы не поддерживаются в MySQL 5.7.
Обычно, операторы, не разрешенные в SQL подготовленные операторы, также не разрешаются в сохраненных программах. Исключения отмечаются в Разделе D.1, "Ограничения на Сохраненные Программы".
Метаданные изменяются на таблицы или просматривают упомянутый готовыми операторами, обнаруживаются и вызывают автоматическую переподготовку оператора, когда это затем выполняется. Для получения дополнительной информации см. Раздел 8.9.4, "Кэширование Готовых Операторов и Сохраненных Программ".
Заполнители могут использоваться для параметров LIMIT
пункт при использовании
готовых операторов. См. Раздел
13.2.9,"SELECT
Синтаксис".
В готовом CALL
операторы, используемые с PREPARE
и EXECUTE
,
поддержка заполнителя OUT
и INOUT
параметры являются
доступным начинанием с MySQL 5.7. См. Раздел
13.2.1,"CALL
Синтаксис", для примера и обходного решения для
более ранних версий. Заполнители могут использоваться для IN
параметры независимо
от версии.
Синтаксис SQL для готовых операторов не может использоваться вложенным способом. Таким образом, оператор, к
которому передают PREPARE
не может самостоятельно быть a PREPARE
, EXECUTE
, или DEALLOCATE PREPARE
оператор.
Синтаксис SQL для готовых операторов отличен от использования готовых вызовов API оператора. Например,
невозможно использовать mysql_stmt_prepare()
C API-функция, чтобы подготовить a PREPARE
, EXECUTE
, или DEALLOCATE PREPARE
оператор.
Синтаксис SQL для готовых операторов может использоваться в пределах хранимых процедур, но не в сохраненных
функциях или триггерах. Однако, курсор не может использоваться для динамического оператора, который готовится и
выполняется с PREPARE
и EXECUTE
. Оператор для курсора проверяется во время создания курсора, таким
образом, оператор не может быть динамичным.
Синтаксис SQL для готовых операторов не поддерживает мультиоператоры (то есть, многократные операторы в пределах
единственной строки, разделенной";
"символы).
Готовые операторы используют кэш запроса при условиях, описанных в Разделе 8.9.3.1, "Как Кэш Запроса Работает".
Записать программы C, которые используют CALL
SQL-оператор, чтобы выполнить хранимые процедуры, которые содержат готовые операторы, CLIENT_MULTI_RESULTS
флаг должен быть включен. Это то, потому что каждый CALL
возвращает результат указать на состояние вызова, в дополнение к любым
наборам результатов, которые могли бы быть возвращены операторами, выполняемыми в пределах процедуры.
CLIENT_MULTI_RESULTS
может быть включен, когда Вы вызываете mysql_real_connect()
, любой явно, передавая CLIENT_MULTI_RESULTS
флаг непосредственно, или неявно передавая CLIENT_MULTI_STATEMENTS
(который также
включает CLIENT_MULTI_RESULTS
). Для дополнительной информации см. Раздел
13.2.1,"CALL
Синтаксис".