Spec-Zone .ru
спецификации, руководства, описания, API
|
Эти ограничения применяются к функциям, описанным в Главе 18, Сохраненных Программах и Представлениях.
Некоторые из ограничений, отмеченных здесь, применяются ко всем сохраненным подпрограммам; то есть, и к хранимым процедурам и к сохраненным функциям. Есть также некоторые ограничения, определенные для сохраненных функций, но не для хранимых процедур.
Ограничения для сохраненных функций также применяются к триггерам. Есть также некоторые ограничения, определенные для триггеров.
Ограничения для хранимых процедур также применяются к DO
пункт определений события Event Scheduler. Есть также некоторые ограничения, определенные для событий.
Сохраненные подпрограммы не могут содержать произвольные SQL-операторы. Следующие операторы не разрешаются:
Операторы блокировки LOCK TABLES
и UNLOCK TABLES
.
LOAD
DATA
и LOAD TABLE
.
SQL подготовленные операторы (PREPARE
, EXECUTE
, DEALLOCATE PREPARE
) может использоваться в хранимых процедурах, но не
сохранил функции или триггеры. Таким образом сохраненные функции и триггеры не могут использовать
динамический SQL (где Вы создаете операторы как строки и затем выполняете их).
Обычно, операторы, не разрешенные в SQL подготовленные операторы, также не
разрешаются в сохраненных программах. Для списка операторов, поддерживаемых как подготовленные
операторы, см. Раздел 13.5, "Синтаксис SQL для
Готовых Операторов". Исключения SIGNAL
,
RESIGNAL
,
и GET DIAGNOSTICS
, которые не допустимы как подготовленные операторы,
но разрешаются в сохраненных программах.
Поскольку локальные переменные находятся в контексте только во время сохраненного
выполнения программы, ссылки на них не разрешаются в готовых операторах, создаваемых в пределах
сохраненной программы. Готовый контекст оператора является текущим сеансом, не сохраненной программой,
таким образом, оператор мог быть выполнен после концов программы, в которой точке переменные больше не
будут в контексте. Например, SELECT ... INTO
не может использоваться в качестве готового оператора. Это ограничение также применяется к хранимой
процедуре и параметрам функции. См. Раздел 13.5.1,"local_var
PREPARE
Синтаксис".
В пределах всех сохраненных программ (хранимые процедуры и функции, триггеры, и
события), обработки синтаксического анализатора BEGIN [WORK]
как начало a BEGIN ... END
блок. Чтобы начать транзакцию в этом контексте,
использовать START
TRANSACTION
вместо этого.
Следующие дополнительные операторы или операции не разрешаются в пределах сохраненных функций. Им разрешают в
пределах хранимых процедур, кроме хранимых процедур, которые вызываются изнутри сохраненной функции или
триггера. Например, если Вы используете FLUSH
в хранимой процедуре ту хранимую процедуру нельзя вызвать от сохраненной функции или триггера.
Операторы, которые выполняют явную или неявную фиксацию или откат. Поддержка этих операторов не требуется стандартом SQL, который утверждает, что каждый поставщик DBMS может решить, разрешить ли им.
Операторы, которые возвращают набор результатов. Это включает SELECT
операторы, которые не имеют INTO
пункт и другие операторы такой как var_list
SHOW
, EXPLAIN
, и CHECK
TABLE
. Функция может обработать набор результатов любой с SELECT ... INTO
или
при использовании курсора и var_list
FETCH
операторы. См. Раздел 13.2.9.1,"SELECT
... INTO
Синтаксис", и Раздел 13.6.6,
"Курсоры".
FLUSH
операторы.
Сохраненные функции не могут использоваться рекурсивно.
Сохраненная функция или триггер не могут изменить таблицу, которая уже используется (для чтения или записи) оператором, который вызвал функцию или триггер.
Если Вы ссылаетесь на временную таблицу многократно в сохраненной функции под
различными псевдонимами, a Can't reopen table: '
ошибка происходит, даже если ссылки происходят в различных
операторах в пределах функции. tbl_name
'
HANDLER ... READ
операторы, которые вызывают сохраненные функции, могут
вызвать ошибки репликации и отвергаются.
Для триггеров применяются следующие дополнительные ограничения:
Триггеры в настоящий момент не активируются действиями внешнего ключа.
При использовании построчной репликации, включает ведомое устройство, не активируются операторами, происходящими на ведущем устройстве. Триггеры на ведомом устройстве активируются при использовании основанной на операторе репликации. Для получения дополнительной информации см. Раздел 16.4.1.31, "Репликация и Триггеры".
RETURN
оператор не разрешается в триггерах, которые не могут возвратить
значение. Чтобы сразу выйти из триггера, используйте LEAVE
оператор.
Триггеры не разрешаются на таблицах в mysql
база
данных.
Триггерный кэш не обнаруживает, когда метаданные базовых объектов изменились. Если триггер использует таблицу, и таблица изменилась, так как триггер был загружен в кэш, триггер управляет использованием устаревших метаданных.
Тот же самый идентификатор мог бы использоваться для стандартного параметра, локальной переменной, и столбца таблицы. Кроме того, то же самое имя локальной переменной может использоваться во вложенных блоках. Например:
CREATE PROCEDURE p (i INT)BEGIN DECLARE i INT DEFAULT 0; SELECT i FROM t; BEGIN DECLARE i INT DEFAULT 1; SELECT i FROM t; END;END;
В таких случаях идентификатор неоднозначен, и следующие правила приоритета применяются:
Локальная переменная имеет приоритет по стандартному параметру или столбцу таблицы.
Стандартный параметр имеет приоритет за столом столбец.
Локальная переменная во внутреннем блоке имеет приоритет по локальной переменной во внешнем блоке.
Поведение, что переменные имеют приоритет по столбцам таблицы, нестандартно.
Использование сохраненных подпрограмм может вызвать проблемы репликации. Эта проблема обсуждается далее в Разделе 18.7, "Двоичное Журналирование Сохраненных Программ".
--replicate-wild-do-table=
опция применяется к таблицам,
представлениям, и триггерам. Это не применяется к хранимым процедурам и функциям, или событиям. Чтобы
фильтровать операторы, работающие на последних объектах, используйте один или больше db_name.tbl_name
--replicate-*-db
опции.
Нет никаких сохраненных стандартных средств отладки.
MySQL сохраненный стандартный синтаксис основан на стандарте SQL:2003. Следующие элементы от того стандарта в настоящий момент не поддерживаются:
UNDO
обработчики
FOR
циклы
Чтобы предотвратить проблемы взаимодействия между сеансами, когда клиент делает заявление, сервер использует снимок подпрограмм и инициировал доступный для выполнения оператора. Таким образом, сервер вычисляет список процедур, функции, и триггеры, которые могут использоваться во время выполнения оператора, загружают их, и затем продолжаются, чтобы выполнить оператор. В то время как оператор выполняется, он не видит изменений к подпрограммам, выполняемым другими сеансами.
Для максимального параллелизма сохраненные функции должны минимизировать свои побочные эффекты; в частности обновление таблицы в пределах сохраненной функции может уменьшить параллельные операции на той таблице. Сохраненная функция получает блокировки таблицы перед выполнением, чтобы избежать несогласованности в двоичном журнале из-за несоответствия порядка, в котором выполняются операторы и когда они появляются в журнале. Когда основанное на операторе двоичное журналирование используется, операторы, которые вызывают функцию, записываются, а не операторы, выполняемые в пределах функции. Следовательно, сохраненные функции, которые обновляют те же самые базовые таблицы, не выполняются параллельно. Напротив, хранимые процедуры не получают блокировки на уровне таблицы. Все операторы, выполняемые в пределах хранимых процедур, пишутся двоичному журналу, даже для основанного на операторе двоичного журналирования. См. Раздел 18.7, "Двоичное Журналирование Сохраненных Программ".
Следующие ограничения являются определенными для Планировщика События:
Имена события обрабатываются нечувствительным к регистру способом. Например, у Вас
не может быть двух событий в той же самой базе данных с именами anEvent
и
AnEvent
.
Событие не может быть создано, изменено, или отброшено сохраненной подпрограммой, триггером, или другим событием. Событие также, возможно, не создает, изменяет, или отбрасывает сохраненные подпрограммы или триггеры. (Ошибка #16409, Ошибка #18896)
Операторы DDL на событиях запрещаются в то время как a LOCK TABLES
оператор в действительности.
Синхронизации события, используя интервалы YEAR
, QUARTER
, MONTH
, и YEAR_MONTH
разрешаются в месяцах; в секундах те, которые используют любой другой интервал, разрешаются. Нет
никакого способа вызвать события, которые, как запланировали, произойдут в ту же самую секунду, чтобы
выполниться в данном порядке. Кроме того — из-за округления, природы поточных приложений, и факта, что
ненулевой отрезок времени обязан создавать события и сигнализировать их выполнение — события могут быть
задержаны на целую 1 или 2 секунды. Однако, время, показанное в INFORMATION_SCHEMA.EVENTS
таблица LAST_EXECUTED
столбец или mysql.event
таблица last_executed
столбец всегда с точностью до в течение одной секунды
после времени выполнения фактического события. (См. также Ошибку #16522.)
Каждое выполнение операторов, содержавшихся в теле события, имеет место в новом
соединении; таким образом, эти операторы не имеет никакого эффекта в данный сеанс пользователя на
количествах оператора сервера такой как Com_select
и Com_insert
это выводится на экран SHOW STATUS
.
Однако, такие количества обновляются в глобальной области
видимости. (Ошибка #16422)
События не поддерживают на несколько времен позже чем конец Эпохи Unix; это - приблизительно начало 2038 года. Такие даты определенно не разрешаются Планировщиком События. (Ошибка #16396)
Ссылки на сохраненные функции, определяемые пользователем функции, и таблицы в
ON SCHEDULE
пункты CREATE EVENT
и ALTER EVENT
операторы не поддерживаются. Эти виды ссылок не
разрешаются. (См. Ошибку #22830 для получения дополнительной информации.)