Spec-Zone.ru › MySQL 8.4

A.4 MySQL 8.4 FAQ: Сохраняемые процедуры и функции

A.4.1. Поддерживает ли MySQL сохраняемые процедуры и функции?
A.4.2. Где можно найти документацию по сохраняемым процедурам и функциям MySQL?
A.4.3. Есть ли форум обсуждения сохраняемых процедур MySQL?
A.4.4. Где можно найти спецификацию ANSI SQL 2003 для сохраняемых процедур?
A.4.5. Как управлять сохраняемыми процедурами?
A.4.6. Можно ли просмотреть все сохраняемые процедуры и функции в заданной базе данных?
A.4.7. Где хранятся сохраняемые процедуры?
A.4.8. Можно ли сгруппировать сохраняемые процедуры или функции в пакеты?
A.4.9. Может ли одна сохраняемая процедура вызывать другую?
A.4.10. Может ли сохраняемая процедура вызывать триггер?
A.4.11. Может ли сохраняемая процедура обращаться к таблицам?
A.4.12. Есть ли в сохраняемых процедурах оператор для поднятия ошибок приложения?
A.4.13. Предоставляют ли сохраняемые процедуры обработку исключений?
A.4.14. Могут ли сохраняемые процедуры MySQL возвращать наборы результатов?
A.4.15. Поддерживается ли WITH RECOMPILE для сохраняемых процедур?
A.4.16. Есть ли аналог mod_plsql в MySQL для работы с сохраняемыми процедурами в базе данных через Apache?
A.4.17. Можно ли передавать массив в качестве входного параметра сохраняемой процедуре?
A.4.18. Можно ли передать курсор как параметр IN сохраняемой процедуре?
A.4.19. Можно ли вернуть курсор как параметр OUT из сохраняемой процедуры?
A.4.20. Можно ли вывести значение переменной внутри сохраняемой процедуры для отладки?
A.4.21. Можно ли выполнять commit или rollback транзакций внутри сохраняемой процедуры?
A.4.22. Работают ли сохраняемые процедуры и функции MySQL с репликацией?
A.4.23. Сохраняемые процедуры и функции, созданные на сервере источника репликации, реплицируются на реплику?
A.4.24. Как реплицируются действия, выполняемые внутри сохраняемых процедур и функций?
A.4.25. Существуют ли особые требования к безопасности при использовании сохраняемых процедур и функций вместе с репликацией?
A.4.26. Какие ограничения существуют для репликации действий сохраняемых процедур и функций?
A.4.27. Влияют ли предыдущие ограничения на возможность MySQL выполнять восстановление по состоянию на определенный момент времени?
A.4.28. Что делается для устранения вышеупомянутых ограничений?

A.4.1.

Поддерживает ли MySQL хранимые процедуры и функции?

Да. MySQL поддерживает два типа хранимых подпрограмм: хранимые процедуры и хранимые функции.

A.4.2.

Где я могу найти документацию по хранимым процедурам и функциям MySQL?

Смотрите Раздел 27.2, «Использование хранимых подпрограмм».

A.4.3.

Есть ли форум обсуждений для хранимых процедур MySQL?

Да. Смотрите https://forums.mysql.com/list.php?98.

A.4.4.

Где я могу найти спецификацию ANSI SQL 2003 для хранимых процедур?

К сожалению, официальные спецификации не доступны бесплатно (ANSI предоставляет их для покупки). Однако существуют книги, такие как SQL-99 Complete, Really Питера Гулуцана и Труди Пельцер, которые предоставляют всесторонний обзор стандарта, включая описание хранимых процедур.

A.4.5.

Как управлять хранимыми подпрограммами?

Всегда рекомендуется использовать четкую схему именования для ваших хранимых подпрограмм. Вы можете управлять хранимыми процедурами с помощью CREATE [FUNCTION|PROCEDURE], ALTER [FUNCTION|PROCEDURE], DROP [FUNCTION|PROCEDURE] и SHOW CREATE [FUNCTION|PROCEDURE]. Вы можете получить информацию о существующих хранимых процедурах, используя таблицу ROUTINES в базе данных INFORMATION_SCHEMA (см. Раздел 28.3.30, «Таблица INFORMATION_SCHEMA ROUTINES»).

A.4.6.

Есть ли способ просмотреть все хранимые процедуры и функции в данной базе данных?

Да. Для базы данных с именем dbname используйте этот запрос к таблице INFORMATION_SCHEMA.ROUTINES:

SELECT ROUTINE_TYPE, ROUTINE_NAME
    FROM INFORMATION_SCHEMA.ROUTINES
    WHERE ROUTINE_SCHEMA='dbname';

Для получения дополнительной информации см. Раздел 28.3.30, «Таблица INFORMATION_SCHEMA ROUTINES».

Тело хранимой подпрограммы можно просмотреть с помощью SHOW CREATE FUNCTION (для хранимой функции) или SHOW CREATE PROCEDURE (для хранимой процедуры). См. Раздел 15.7.7.10, «Инструкция SHOW CREATE PROCEDURE», для получения дополнительной информации.

A.4.7.

Где хранятся хранимые процедуры?

Хранимые процедуры хранятся в таблицах mysql.routines и mysql.parameters, которые являются частью словаря данных. Вы не можете напрямую обращаться к этим таблицам. Вместо этого запросите таблицы INFORMATION_SCHEMA ROUTINES и PARAMETERS. См. Раздел 28.3.30, «Таблица INFORMATION_SCHEMA ROUTINES», и Раздел 28.3.20, «Таблица INFORMATION_SCHEMA PARAMETERS».

Вы также можете использовать SHOW CREATE FUNCTION для получения информации о хранимых функциях и SHOW CREATE PROCEDURE для получения информации о хранимых процедурах. См. Раздел 15.7.7.10, «Инструкция SHOW CREATE PROCEDURE».

A.4.8.

Можно ли группировать хранимые процедуры или функции в пакеты?

Нет. Это не поддерживается в MySQL.

A.4.9.

Может ли хранимая процедура вызывать другую хранимую процедуру?

Да.

A.4.10.

Может ли хранимая процедура вызывать триггер?

Хранимая процедура может выполнить оператор SQL, например, UPDATE, который приводит к активации триггера.

A.4.11.

Может ли хранимая процедура обращаться к таблицам?

Да. Хранимая процедура может обращаться к одной или нескольким таблицам по мере необходимости.

A.4.12.

Есть ли у хранимых процедур оператор для генерации ошибок приложений?

Да. MySQL реализует операторы стандарта SQL SIGNAL и RESIGNAL. Смотрите Раздел 15.6.7, «Обработка условий».

A.4.13.

Предоставляют ли хранимые процедуры обработку исключений?

MySQL реализует определения HANDLER в соответствии со стандартом SQL. Подробности см. в Разделе 15.6.7.2, «Оператор DECLARE ... HANDLER».

A.4.14.

Могут ли хранимые подпрограммы MySQL возвращать результирующие наборы?

Хранимые процедуры могут, но хранимые функции — нет. Если вы выполняете обычный SELECT внутри хранимой процедуры, результирующий набор возвращается клиенту напрямую. Для этого вам необходимо использовать протокол клиент/сервер MySQL 4.1 (или выше). Это означает, что, например, в PHP вам нужно использовать расширение mysqli, а не старое расширение mysql.

A.4.15.

Поддерживается ли WITH RECOMPILE для хранимых процедур?

Нет.

A.4.16.

Есть ли в MySQL эквивалент использования mod_plsql в качестве шлюза на Apache для прямого взаимодействия с хранимой процедурой в базе данных?

В MySQL нет эквивалента.

A.4.17.

Могу ли я передать массив в качестве входного параметра в хранимую процедуру?

Нет.

A.4.18.

Могу ли я передать курсор в качестве параметра IN в хранимую процедуру?

Курсоры доступны только внутри хранимых процедур.

A.4.19.

Могу ли я вернуть курсор в качестве параметра OUT из хранимой процедуры?

Курсоры доступны только внутри хранимых процедур. Однако, если вы не открываете курсор на SELECT, результат отправляется напрямую клиенту. Вы также можете SELECT INTO переменные. См. Раздел 15.2.13, «Оператор SELECT».

A.4.20.

Могу ли я вывести значение переменной внутри хранимой подпрограммы для целей отладки?

Да, вы можете сделать это в сохраненной процедуре, но не в сохраненной функции. Если вы выполните обычное SELECT внутри сохраненной процедуры, набор результатов будет возвращен непосредственно клиенту. Для этого необходимо использовать протокол клиента/сервера MySQL 4.1 (или выше). Это означает, что, например, в PHP вам нужно использовать расширение mysqli, а не старое расширение mysql.

A.4.21.

Могу ли я подтвердить или откатить транзакции внутри сохраненной процедуры?

Да. Однако вы не можете выполнять транзакционные операции внутри сохраненной функции.

A.4.22.

Работают ли сохраненные процедуры и функции MySQL с репликацией?

Да, стандартные действия, выполняемые в сохраненных процедурах и функциях, реплицируются с сервера источника репликации на реплику. Существуют некоторые ограничения, подробно описанные в Разделе 27.7, «Логирование двоичных данных сохраненных программ».

A.4.23.

Реплицируются ли сохраненные процедуры и функции, созданные на сервере источника репликации, на реплику?

Да, создание сохраненных процедур и функций, выполняемое с помощью обычных DDL-операций на сервере источника репликации, реплицируется на реплику, так что объекты существуют на обоих серверах. ALTER и DROP операторы для сохраненных процедур и функций также реплицируются.

A.4.24.

Как реплицируются действия, выполняемые внутри сохраненных процедур и функций?

MySQL записывает каждое событие DML, которое происходит в сохраненной процедуре, и реплицирует эти отдельные действия на реплику. Фактические вызовы для выполнения сохраненных процедур не реплицируются.

Сохраненные функции, изменяющие данные, регистрируются как вызовы функций, а не как события DML, которые происходят внутри каждой функции.

A.4.25.

Существуют ли особые требования безопасности для использования сохраненных процедур и функций вместе с репликацией?

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

  1. Любому пользователю, желающему создать сохраненные функции, необходимо предоставить привилегию SUPER.

  2. В качестве альтернативы DBA может установить переменную системы log_bin_trust_function_creators в 1, что позволит любому пользователю с обычной привилегией CREATE ROUTINE создавать сохраненные функции.

A.4.26.

Какие ограничения существуют для репликации действий сохраненных процедур и функций?

Недетерминированные (случайные) или основанные на времени действия, встроенные в сохраненные процедуры, могут не реплицироваться должным образом. По своей природе случайно полученные результаты непредсказуемы и не могут быть точно воспроизведены; поэтому случайные действия, реплицированные на реплику, не отражают тех, которые выполнялись на источнике. Объявление сохраненных функций как DETERMINISTIC или установка переменной системы log_bin_trust_function_creators в 0 предотвращает вызов случайных операций, генерирующих случайные значения.

Кроме того, действия, основанные на времени, не могут быть воспроизведены на реплике, потому что время выполнения таких действий в сохраненной процедуре не воспроизводимо через двоичный журнал, используемый для репликации. Он записывает только события DML и не учитывает временные ограничения.

Наконец, для нетранзакционных таблиц, для которых возникают ошибки во время больших действий DML (например, массовых вставок), могут возникнуть проблемы с репликацией, поскольку источник может быть частично обновлен из-за активности DML, но обновления не выполняются на реплике из-за возникших ошибок. Обходным путем является выполнение действий DML функции с ключевым словом IGNORE, чтобы обновления на источнике, вызывающие ошибки, игнорировались, а обновления, которые не вызывают ошибок, реплицировались на реплику.

A.4.27.

Возникают ли перечисленные ограничения на возможность MySQL выполнять восстановление по состоянию на определенную точку времени?

Те же ограничения, которые влияют на репликацию, влияют и на восстановление по состоянию на определенную точку времени.

A.4.28.

Что делается для исправления вышеупомянутых ограничений?

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

Также доступна смешанная репликация (путем запуска сервера с --binlog-format=mixed). Этот гибридный вид репликации “знает”, можно ли безопасно использовать репликацию на уровне оператора или требуется репликация на уровне строк.

Дополнительную информацию см. в Разделе 19.2.1, «Форматы репликации».

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

Spec-Zone.ru

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