Spec-Zone .ru
спецификации, руководства, описания, API
|
Вопросы
B.4.1: MySQL 5.7 поддерживает хранимые процедуры и функции?
B.4.2: Где я могу найти документацию для хранимых процедур MySQL и сохраненных функций?
B.4.3: есть ли дискуссионный форум для хранимых процедур MySQL?
B.4.4: Где я могу найти спецификацию ANSI SQL 2003 года для хранимых процедур?
B.4.5: Как Вы управляете сохраненными подпрограммами?
B.4.6: есть ли способ просмотреть все хранимые процедуры и сохраненные функции в данной базе данных?
B.4.7: Где хранимые процедуры сохранены?
B.4.8: действительно ли возможно сгруппировать хранимые процедуры или сохраненные функции в пакеты?
B.4.9: хранимая процедура может вызвать другую хранимую процедуру?
B.4.10: хранимая процедура может вызвать триггер?
B.4.11: действительно ли хранимая процедура может получить доступ к таблицам?
B.4.12: у хранимых процедур есть оператор для того, чтобы повысить ошибки приложения?
B.4.13: хранимые процедуры обеспечивают обработку исключений?
B.4.14: Может MySQL 5.7 сохраненные подпрограммы возвращать наборы результатов?
B.4.15: WITH RECOMPILE
поддерживаемый для хранимых процедур?
B.4.16: Есть ли MySQL,
эквивалентный использованию mod_plsql
как шлюз на Apache, чтобы говорить
непосредственно с хранимой процедурой в базе данных?
B.4.17: я могу передать массив как входной к хранимой процедуре?
B.4.18: Могу я передавать
курсор как IN
параметр к хранимой процедуре?
B.4.19: Могу я возвращать
курсор как OUT
параметр из хранимой процедуры?
B.4.20: я могу распечатать значение переменной в пределах сохраненной подпрограммы для того, чтобы отладить цели?
B.4.21: я могу фиксировать или откатывать транзакции в хранимой процедуре?
B.4.22: хранимые процедуры MySQL 5.7 и функции работают с репликацией?
B.4.23: хранимые процедуры и функции создаются на главном сервере, тиражированном в ведомое устройство?
B.4.24: Как действия, которые имеют место в хранимых процедурах и тиражированных функциях?
B.4.25: Есть ли специальные требования к защите для того, чтобы использовать хранимые процедуры, и функционирует вместе с репликацией?
B.4.26: Какие ограничения существуют для того, чтобы тиражировать хранимую процедуру и функциональные действия?
B.4.27: предыдущие ограничения влияют на возможность MySQL сделать восстановление момента времени?
B.4.28: Что делается, чтобы исправить вышеупомянутые ограничения?
Вопросы и Ответы
B.4.1: MySQL 5.7 поддерживает хранимые процедуры и функции?
Да. MySQL 5.7 поддерживает два типа сохраненных подпрограмм — хранимые процедуры и сохраненные функции.
B.4.2: Где я могу найти документацию для хранимых процедур MySQL и сохраненных функций?
См. Раздел 18.2, "Используя Сохраненные Подпрограммы (Процедуры и Функции)".
B.4.3: есть ли дискуссионный форум для хранимых процедур MySQL?
Да. См.
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 есть две опции безопасности, открытые для них:
Любого пользователя, желающего создать сохраненные функции, нужно предоставить SUPER
полномочие.
Альтернативно, 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, "Форматы Репликации".