Spec-Zone.ru › MySQL 5.7

A.4 MySQL 5.7 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. Есть ли в MySQL эквивалент использования mod_plsql в качестве шлюза на 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?

См. Раздел 23.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 (см. Раздел 24.3.21, «Таблица INFORMATION_SCHEMA ROUTINES»).

A.4.6.

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

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

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

Более подробную информацию см. в Разделе 24.3.21, «Таблица INFORMATION_SCHEMA ROUTINES».

Тело хранимой процедуры можно просмотреть, используя SHOW CREATE FUNCTION (для хранимой функции) или SHOW CREATE PROCEDURE (для хранимой процедуры). Подробнее см. в Разделе 13.7.5.9, «Команда SHOW CREATE PROCEDURE».

A.4.7.

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

В таблице proc системной базы данных mysql. Однако напрямую обращаться к таблицам системной базы данных не следует. Вместо этого следует использовать запросы к таблицам INFORMATION_SCHEMA ROUTINES и PARAMETERS. См. Раздел 24.3.21, «Таблица INFORMATION_SCHEMA ROUTINES» и Раздел 24.3.15, «Таблица INFORMATION_SCHEMA PARAMETERS».

Также можно использовать SHOW CREATE FUNCTION для получения информации о хранимых функциях и SHOW CREATE PROCEDURE для получения информации о хранимых процедурах. См. Раздел 13.7.5.9, «Команда 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. См. Раздел 13.6.7, «Обработка условий».

A.4.13.

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

MySQL реализует определения HANDLER в соответствии со стандартом SQL. Подробности см. в Разделе 13.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 переменные. См. Раздел 13.2.9, «Команда SELECT».

A.4.20.

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

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

A.4.21.

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

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

A.4.22.

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

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

A.4.23.

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

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

A.4.24.

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

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

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

A.4.25.

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

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

  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). Этот гибридный вид репликации “знает”, можно ли безопасно использовать репликацию на уровне операторов или требуется репликация на уровне строк.

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

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

Spec-Zone.ru

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