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.