Spec-Zone .ru
спецификации, руководства, описания, API

13.5. Синтаксис SQL для Готовых Операторов

13.5.1. PREPARE Синтаксис
13.5.2. EXECUTE Синтаксис
13.5.3. DEALLOCATE PREPARE Синтаксис

MySQL 5.7 оказывает поддержку для стороны сервера подготовленные операторы. Эта поддержка использует в своих интересах эффективный клиент-серверный протокол двоичной синхронной передачи данных, доступный начиная с MySQL 4.1. Используя готовые операторы с заполнителями для параметра значения обладает следующими преимуществами:

Готовые Операторы в Прикладных программах

Можно использовать сторону сервера подготовленные операторы через клиентские интерфейсы программирования, включая клиентскую библиотеку 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 расширение, доступное в PHP 5.0 и позже.

Готовые Операторы в Сценариях SQL

Альтернативный интерфейс SQL к готовым операторам доступен. Этот интерфейс не столь же эффективен как использование протокола двоичной синхронной передачи данных через готовый API оператора, но не требует никакого программирования, потому что это доступно непосредственно на уровне SQL:

Синтаксис SQL для готовых операторов предназначается, чтобы использоваться для ситуаций, таких как они:

PREPARE, EXECUTE, и DEALLOCATE PREPARE Операторы

Синтаксис SQL для готовых операторов основан на трех SQL-операторах:

Следующие примеры показывают два эквивалентных способа подготовить оператор, который вычисляет гипотенузу треугольника, данного длины этих двух сторон.

Первый пример показывает, как создать готовый оператор при использовании строкового литерала, чтобы предоставить текст оператора:

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, Позволенный в Готовых Операторах

Следующие 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 Синтаксис".