Spec-Zone.ru › MySQL 9.2

A.4 MySQL 9.2 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. Можно ли передать курсор в качестве входного параметра сохранённой процедуре?
A.4.19. Можно ли вернуть курсор в качестве выходного параметра сохранённой процедуры?
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.32, «Таблица 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.32, «Таблица INFORMATION_SCHEMA ROUTINES».

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

A.4.7.

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

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

Вы также можете использовать SHOW CREATE FUNCTION для получения информации о хранимых функциях и SHOW CREATE PROCEDURE для получения информации о хранимых процедурах. См. Раздел 15.7.7.11, «Инструкция 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.8, «Журналирование двоичного кода хранимых программ».

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-9.2-en/faqs-stored-procs.html

Spec-Zone.ru

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