Spec-Zone.ru › MySQL 9.2

15.5.1 Оператор PREPARE

PREPARE stmt_name FROM preparable_stmt

Оператор PREPARE подготавливает SQL-запрос и присваивает ему имя, stmt_name, для последующей ссылки на него. Подготовленный запрос выполняется с помощью EXECUTE и освобождается с помощью DEALLOCATE PREPARE. Примеры см. в разделе 15.5, «Подготовленные запросы».

Имена операторов нечувствительны к регистру. preparable_stmt представляет собой либо строковую литерал, либо пользовательскую переменную, содержащую текст SQL-запроса. Текст должен представлять собой один запрос, а не несколько. Внутри запроса ? символы могут использоваться в качестве маркеров параметров, чтобы указать, где будут привязаны значения данных к запросу позже при его выполнении. ? символы не должны быть заключены в кавычки, даже если вы намерены привязать их к строковым значениям. Маркеры параметров могут использоваться только там, где должны появляться значения данных, а не для SQL-ключевых слов, идентификаторов и т.д.

Если подготовленный запрос с данным именем уже существует, он неявно освобождается перед подготовкой нового запроса. Это означает, что если новый запрос содержит ошибку и не может быть подготовлен, возвращается ошибка, и никакой запрос с данным именем не существует.

Область действия подготовленного оператора — сессия, в которой он создан, что влечёт несколько последствий:

  • Подготовленный оператор, созданный в одной сессии, недоступен другим сессиям.

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

  • Подготовленный оператор, созданный внутри хранимой программы, продолжает существовать после завершения выполнения программы и может быть выполнен вне программы позже.

  • Оператор, подготовленный в контексте хранимой программы, не может ссылаться на параметры хранимой процедуры или функции или локальные переменные, поскольку они выходят из области видимости при завершении программы и были бы недоступны в случае выполнения оператора позже вне программы. В качестве обходного решения обратитесь вместо этого к переменным пользователя, которые также имеют область действия сессии; см. Раздел 11.4, «Переменные пользователя».

Тип параметра, используемого в подготовленном операторе, определяется при первой подготовке оператора; он сохраняет этот тип всякий раз, когда EXECUTE вызывается для этого подготовленного оператора (если оператор не переподготовлен, как описано позже в этом разделе). Правила определения типа параметра перечислены здесь:

  • Параметр, являющийся операндом бинарного арифметического оператора, имеет тот же тип данных, что и другой операнд.

  • Если оба операнда бинарного арифметического оператора являются параметрами, тип параметров определяется контекстом оператора.

  • Если параметр является операндом унарного арифметического оператора, тип параметра определяется контекстом оператора.

  • Если у арифметического оператора нет контекста определения типа, тип, полученный для любого участвующего параметра, — DOUBLE PRECISION. Это может произойти, например, когда параметр является узлом верхнего уровня в списке SELECT или когда он является частью оператора сравнения.

  • Параметр, являющийся операндом оператора строкового типа, имеет тот же полученный тип, что и агрегированный тип других операндов. Если все операнды оператора являются параметрами, полученный тип — VARCHAR; его сортировка определяется значением collation_connection.

  • Параметр, являющийся операндом временного оператора, имеет тип DATETIME, если оператор возвращает DATETIME, TIME, если оператор возвращает TIME, и DATE, если оператор возвращает DATE.

  • Параметр, являющийся операндом бинарного оператора сравнения, имеет тот же полученный тип, что и другой операнд сравнения.

  • Параметр, являющийся операндом тернарного оператора сравнения, такого как BETWEEN, имеет тот же полученный тип, что и агрегированный тип других операндов.

  • Если все операнды оператора сравнения являются параметрами, полученный тип для каждого из них — VARCHAR, а сортировка определяется значением collation_connection.

  • Параметр, являющийся выходным операндом любого из CASE, COALESCE, IF, IFNULL или NULLIF, имеет тот же полученный тип, что и агрегированный тип других выходных операндов оператора.

  • Если все выходные операнды любого из CASE, COALESCE, IF, IFNULL или NULLIF являются параметрами или все являются NULL, тип параметра определяется контекстом оператора.

  • Если параметр является операндом любого из CASE, COALESCE(), IF или IFNULL, и у него нет контекста определения типа, полученный тип каждого из участвующих параметров — VARCHAR, а его сортировка определяется значением collation_connection.

  • Параметр, который является операндом CAST(), имеет тот же тип, что и указано CAST().

  • Если параметр является непосредственным членом списка SELECT, который не является частью оператора INSERT, полученный тип параметра — VARCHAR, а его сортировка определяется значением collation_connection.

  • Если параметр является непосредственным членом списка SELECT, который является частью оператора INSERT, полученный тип параметра — тип соответствующего столбца, в который вставляется параметр.

  • Если параметр используется в качестве источника присваивания в предложении SET оператора UPDATE или в предложении ON DUPLICATE KEY UPDATE оператора INSERT, полученный тип параметра — тип соответствующего столбца, который обновляется предложению SET или ON DUPLICATE KEY UPDATE.

  • Если параметр является аргументом функции, полученный тип зависит от типа возвращаемого значения функции.

Для некоторых комбинаций фактического типа и полученного типа происходит автоматическая переподготовка оператора, чтобы обеспечить большую совместимость с предыдущими версиями MySQL. Переподготовка не происходит, если выполняется любое из следующих условий:

  • NULL используется в качестве фактического значения параметра.

  • Параметр является операндом CAST(). (Вместо этого выполняется приведение к производному типу, и если приведение не удаётся, генерируется исключение.)

  • Параметр — это строка. (В этом случае выполняется неявное CAST(? AS derived_type).)

  • Производный и фактический типы параметра — это INTEGER и имеют одинаковый знак.

  • Производный тип параметра — DECIMAL, а его фактический тип — либо DECIMAL, либо INTEGER.

  • Производный тип — DOUBLE, а фактический тип — любой числовой тип.

  • И производный, и фактический типы — строковые типы.

  • Если производный тип временной, и фактический тип временной. Исключения: Производный тип — TIME, а фактический — не TIME; производный тип — DATE, а фактический — не DATE.

  • Производный тип — временной, а фактический — числовой.

В остальных случаях утверждение пересоставляется, и вместо производных типов параметров используются фактические типы параметров.

Эти правила также применяются к переменной пользователя, указанной в подготовленном запросе.

Использование другого типа данных для данного параметра или переменной пользователя в подготовленном запросе при последующих выполнениях запроса приводит к повторной подготовке запроса. Это менее эффективно; это также может привести к изменению фактического типа параметра (или переменной) и, следовательно, к несогласованным результатам при последующих выполнениях подготовленного запроса. По этим причинам рекомендуется использовать один и тот же тип данных для данного параметра при повторном выполнении подготовленного запроса.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/prepare.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API