Spec-Zone .ru
спецификации, руководства, описания, API

B.4. FAQ MySQL 5.7: Хранимые процедуры и Функции

Вопросы

Вопросы и Ответы

B.4.1: MySQL 5.7 поддерживает хранимые процедуры и функции?

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

B.4.2: Где я могу найти документацию для хранимых процедур MySQL и сохраненных функций?

См. Раздел 18.2, "Используя Сохраненные Подпрограммы (Процедуры и Функции)".

B.4.3: есть ли дискуссионный форум для хранимых процедур MySQL?

Да. См. http://forums.mysql.com/list.php?98.

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

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

B.4.5: Как Вы управляете сохраненными подпрограммами?

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

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

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

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

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

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

B.4.7: Где хранимые процедуры сохранены?

В proc таблица mysql системная база данных. Однако, недопустимо получить доступ к таблицам в системной базе данных непосредственно. Вместо этого используйте SHOW CREATE FUNCTION получить информацию о сохраненных функциях, и SHOW CREATE PROCEDURE получить информацию о хранимых процедурах. См. Раздел 13.7.5.9,"SHOW CREATE PROCEDURE Синтаксис", для получения дополнительной информации об этих операторах.

Можно также запросить ROUTINES таблица в INFORMATION_SCHEMA база данных — видит Раздел 19.19," INFORMATION_SCHEMA ROUTINES Таблица", для информации об этой таблице.

B.4.8: действительно ли возможно сгруппировать хранимые процедуры или сохраненные функции в пакеты?

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

B.4.9: хранимая процедура может вызвать другую хранимую процедуру?

Да.

B.4.10: хранимая процедура может вызвать триггер?

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

B.4.11: действительно ли хранимая процедура может получить доступ к таблицам?

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

B.4.12: у хранимых процедур есть оператор для того, чтобы повысить ошибки приложения?

Да. MySQL 5.7 реализует стандарт SQL SIGNAL и RESIGNAL операторы. См. Раздел 13.6.7, "Обработка Условия".

B.4.13: хранимые процедуры обеспечивают обработку исключений?

Реализации MySQL HANDLER определения согласно стандарту SQL. См. Раздел 13.6.7.2,"DECLARE ... HANDLER Синтаксис", для деталей.

B.4.14: Может MySQL 5.7 сохраненные подпрограммы возвращать наборы результатов?

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

B.4.15: WITH RECOMPILE поддерживаемый для хранимых процедур?

Не в MySQL 5.7.

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

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

B.4.17: я могу передать массив как входной к хранимой процедуре?

Не в MySQL 5.7.

B.4.18: Могу я передавать курсор как IN параметр к хранимой процедуре?

В MySQL 5.7 курсоры являются доступными внутренними хранимыми процедурами только.

B.4.19: Могу я возвращать курсор как OUT параметр из хранимой процедуры?

В MySQL 5.7 курсоры являются доступными внутренними хранимыми процедурами только. Однако, если Вы не открываете курсор на a SELECT, результат будет отправлен непосредственно клиенту. Вы можете также SELECT INTO переменные. См. Раздел 13.2.9,"SELECT Синтаксис".

B.4.20: я могу распечатать значение переменной в пределах сохраненной подпрограммы для того, чтобы отладить цели?

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

B.4.21: я могу фиксировать или откатывать транзакции в хранимой процедуре?

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

B.4.22: хранимые процедуры MySQL 5.7 и функции работают с репликацией?

Да, стандартные действия, выполненные в хранимых процедурах и функциях, тиражируются от основного сервера MySQL до ведомого сервера. Есть несколько ограничений, которые описываются подробно в Разделе 18.7, "Двоичное Журналирование Сохраненных Программ".

B.4.23: хранимые процедуры и функции создаются на главном сервере, тиражированном в ведомое устройство?

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

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

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

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

B.4.25: Есть ли специальные требования к защите для того, чтобы использовать хранимые процедуры, и функционирует вместе с репликацией?

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

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

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

B.4.26: Какие ограничения существуют для того, чтобы тиражировать хранимую процедуру и функциональные действия?

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

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

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

B.4.27: предыдущие ограничения влияют на возможность MySQL сделать восстановление момента времени?

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

B.4.28: Что делается, чтобы исправить вышеупомянутые ограничения?

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

Смешанная репликация также доступна (запуская сервер с --binlog-format=mixed). Этот гибрид, "умная" форма репликации "знает", может ли репликация на уровне оператора безопасно использоваться, или репликация на уровне строки требуется.

Для дополнительной информации см. Раздел 16.1.2, "Форматы Репликации".