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? |
|
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. |
Как управлять хранимыми процедурами? |
Всегда рекомендуется использовать чёткую схему именования хранимых процедур. Вы можете управлять хранимыми процедурами с помощью |
|
|
A.4.6. |
Существует ли способ просмотра всех хранимых процедур и функций в заданной базе данных? |
|
Да. Для базы данных с именем SELECT ROUTINE_TYPE, ROUTINE_NAME
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA='Более подробную информацию см. в Разделе 24.3.21, «Таблица INFORMATION_SCHEMA ROUTINES». Тело хранимой процедуры можно просмотреть, используя |
|
|
A.4.7. |
Где хранятся хранимые процедуры? |
|
В таблице Также можно использовать |
|
|
A.4.8. |
Можно ли группировать хранимые процедуры или функции в пакеты? |
Нет. Это не поддерживается в MySQL. |
|
|
A.4.9. |
Может ли хранимая процедура вызвать другую хранимую процедуру? |
Да. |
|
|
A.4.10. |
Может ли хранимая процедура вызвать триггер? |
Хранимые процедуры могут выполнять SQL-запрос, например, |
|
|
A.4.11. |
Может ли хранимая процедура обращаться к таблицам? |
Да. Хранимые процедуры могут обращаться к одной или нескольким таблицам по мере необходимости. |
|
|
A.4.12. |
Есть ли в хранимых процедурах оператор для поднятия ошибок приложения? |
Да. MySQL реализует стандартные SQL-операторы |
|
|
A.4.13. |
Предоставляют ли хранимые процедуры обработку исключений? |
MySQL реализует определения |
|
|
A.4.14. |
Могут ли хранимые процедуры MySQL возвращать наборы результатов? |
Хранимые процедуры могут, но хранимые функции — нет. Если внутри хранимой процедуры выполняется обычный |
|
|
A.4.15. |
Поддерживается ли |
Нет. |
|
|
A.4.16. |
Существует ли в MySQL эквивалент использования |
В MySQL такого эквивалента нет. |
|
|
A.4.17. |
Можно ли передавать массив в качестве входного параметра хранимой процедуре? |
Нет. |
|
|
A.4.18. |
Можно ли передавать курсор в качестве |
Курсоры доступны только внутри хранимых процедур. |
|
|
A.4.19. |
Можно ли вернуть курсор в качестве |
Курсоры доступны только внутри хранимых процедур. Однако, если курсор не открыт на |
|
|
A.4.20. |
Можно ли вывести значение переменной внутри хранимой процедуры для отладки? |
Да, это можно сделать в хранимой процедуре, но не в хранимой функции. Если вы выполните обычное |
|
|
A.4.21. |
Могу ли я выполнить подтверждение или откат транзакций внутри хранимой процедуры? |
Да. Однако вы не можете выполнять транзакционные операции внутри хранимой функции. |
|
|
A.4.22. |
Работают ли хранимые процедуры и функции MySQL с репликацией? |
Да, стандартные действия, выполняемые в хранимых процедурах и функциях, реплицируются с сервера источника репликации на реплику. Существует несколько ограничений, подробно описанных в Разделе 23.7 «Журналирование двоичных кодов хранимых программ». |
|
|
A.4.23. |
Хранимые процедуры и функции, созданные на сервере источника репликации, реплицируются на реплику? |
Да, создание хранимых процедур и функций, осуществляемое с помощью обычных операторов DDL на сервере источника репликации, реплицируется на реплику, так что объекты существуют на обоих серверах. Также реплицируются операторы |
|
|
A.4.24. |
Как реплицируются действия, выполняемые внутри хранимых процедур и функций? |
|
MySQL записывает каждый событие DML, которое происходит в хранимой процедуре, и реплицирует эти отдельные действия на реплику. Фактические вызовы для выполнения хранимых процедур не реплицируются. Хранимые функции, изменяющие данные, регистрируются как вызовы функций, а не как события DML, происходящие внутри каждой функции. |
|
|
A.4.25. |
Существуют ли специальные требования к безопасности при использовании хранимых процедур и функций совместно с репликацией? |
|
Да. Поскольку у реплики есть полномочия для выполнения любого оператора, считанного из двоичного журнала источника, существуют особые ограничения безопасности при использовании хранимых функций с репликацией. Если репликация или журналирование двоичных данных в целом (для целей восстановления по состоянию на определенный момент времени) активны, у MySQL DBA есть два варианта обеспечения безопасности:
|
|
|
A.4.26. |
Какие ограничения существуют для репликации действий хранимых процедур и функций? |
|
Недетерминированные (случайные) или основанные на времени действия, встроенные в хранимые процедуры, могут не реплицироваться должным образом. По своей природе случайно сгенерированные результаты непредсказуемы и не могут быть точно воспроизведены; поэтому случайные действия, реплицированные на реплику, не отражают те, что выполняются на источнике. Объявление хранимых функций Кроме того, действия, основанные на времени, не могут быть воспроизведены на реплике, поскольку временные параметры таких действий в хранимой процедуре не воспроизводимы через двоичный журнал, используемый для репликации. Он записывает только события DML и не учитывает временные ограничения. Наконец, для нетранзакционных таблиц, для которых при больших действиях DML (таких как массовые вставки) возникают ошибки, могут возникнуть проблемы с репликацией, заключающиеся в том, что источник может быть частично обновлен в результате активности DML, но обновления не выполняются на реплике из-за произошедших ошибок. Решением является выполнение действий DML функции с ключевым словом |
|
|
A.4.27. |
Оказывают ли указанные ограничения влияние на возможность MySQL выполнять восстановление по состоянию на определенный момент времени? |
Те же ограничения, что и для репликации, влияют и на восстановление по состоянию на определенный момент времени. |
|
|
A.4.28. |
Что делается для исправления вышеупомянутых ограничений? |
|
Можно выбрать либо репликацию на основе операторов, либо репликацию на основе строк. Первоначальная реализация репликации основана на журналировании двоичных данных на основе операторов. Журналирование двоичных данных на основе строк решает упомянутые ранее ограничения. Также доступна смешанная репликация (путем запуска сервера с Дополнительную информацию см. в Разделе 16.2.1 «Форматы репликации». |
© 2025 Oracle
Licensed under the GPLv2 License.