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? |
|
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='Для получения дополнительной информации см. Раздел 28.3.32, «Таблица 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 с репликацией? |
Да, стандартные действия, выполняемые в хранимых процедурах и функциях, реплицируются с сервера-источника репликации на реплику. Существует несколько ограничений, которые подробно описаны в разделе 27.8, «Журналирование двоичного кода хранимых программ». |
|
|
A.4.23. |
Хранимые процедуры и функции, созданные на сервере-источнике репликации, реплицируются на реплику? |
Да, создание хранимых процедур и функций, выполненное с помощью обычных операторов DDL на сервере-источнике репликации, реплицируется на реплику, так что объекты существуют на обоих серверах. |
|
|
A.4.24. |
Как реплицируются действия, выполняемые внутри хранимых процедур и функций? |
|
MySQL записывает каждое событие DML, которое происходит в хранимой процедуре, и реплицирует эти отдельные действия на реплику. Фактические вызовы для выполнения хранимых процедур не реплицируются. Хранимые функции, изменяющие данные, регистрируются как вызовы функции, а не как события DML, которые происходят внутри каждой функции. |
|
|
A.4.25. |
Существуют ли особые требования к безопасности для использования хранимых процедур и функций вместе с репликацией? |
|
Да. Поскольку реплика имеет полномочия для выполнения любого оператора, считанного из двоичного журнала источника, существуют особые ограничения безопасности для использования хранимых функций с репликацией. Если репликация или двоичное протоколирование в целом (в целях восстановления состояния на определенный момент времени) активны, у MySQL DBAs есть два варианта обеспечения безопасности:
|
|
|
A.4.26. |
Какие ограничения существуют для репликации действий хранимых процедур и функций? |
|
Недетерминированные (случайные) или основанные на времени действия, встроенные в хранимые процедуры, могут не реплицироваться должным образом. По своей природе случайно полученные результаты непредсказуемы и не могут быть точно воспроизведены; поэтому случайные действия, реплицированные на реплику, не отражают те, что выполнялись на источнике. Объявление хранимых функций как Кроме того, основанные на времени действия не могут быть воспроизведены на реплике, потому что временные параметры таких действий в хранимой процедуре не воспроизводимы через двоичный журнал, используемый для репликации. Он записывает только события DML и не учитывает временные ограничения. Наконец, для не транзакционных таблиц, для которых возникают ошибки во время больших операций DML (таких как массовые вставки), могут возникнуть проблемы с репликацией, так как исходные данные могут быть частично обновлены действиями DML, но обновления не будут выполнены на реплике из-за произошедших ошибок. Способ решения — выполнять DML действия функции с ключевым словом |
|
|
A.4.27. |
Оказывают ли перечисленные ограничения влияние на способность MySQL выполнять восстановление состояния на определенный момент времени? |
Те же ограничения, которые влияют на репликацию, влияют и на восстановление состояния на определенный момент времени. |
|
|
A.4.28. |
Что делается для исправления упомянутых ограничений? |
|
Вы можете выбрать либо репликацию на основе операторов, либо репликацию на основе строк. Первоначальная реализация репликации основана на двоичном журналировании операторов. Двоичное журналирование на основе строк устраняет упомянутые ранее ограничения. Также доступна смешанная репликация (путем запуска сервера с Для получения дополнительной информации см. раздел 19.2.1, «Форматы репликации». |
© 2025 Oracle
Licensed under the GPLv2 License.