Выбрать главу

Эта инструкция используется, чтобы из выйти любой помеченной конструкции управления потоком данных. Это может использоваться внутри BEGIN … END или же конструкций цикла (LOOP, REPEAT, WHILE).

5.2.10.5. Инструкция ITERATE

ITERATE label

ITERATE может появляться только внутри инструкций LOOP, REPEAT и WHILE. ITERATE означает "выполнить цикл снова ".

Пример:CREATE PROCEDURE doiterate(p1 INT)

BEGIN

label1: LOOP

SET p1 = p1 + 1;

IF p1 < 10 THEN ITERATE label1;

END IF;

LEAVE label1;

END LOOP label1;

SET @x = p1;

END

5.2.10.6. Инструкция REPEAT

[begin_labeclass="underline" ]

REPEAT statement_list

UNTIL search_condition

END REPEAT

[end_label]

Операторный список внутри инструкции REPEAT повторен, пока search_condition равно true. Таким образом, REPEAT всегда проходит цикл по крайней мере один раз. Перечень statement_list состоит из одной или большего числа инструкций. Инструкция REPEAT может быть помечена по обычным правилам.

mysql> delimiter //

mysql> CREATE PROCEDURE dorepeat(p1 INT)

– > BEGIN

– > SET @x = 0;

– > REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;

– > END

– > //

Query OK, 0 rows affected (0.00 sec)

mysql> CALL dorepeat(1000)//

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @x//

+------+

| @x |

+------+

| 1001 |

+------+

1 row in set (0.00 sec)

5.2.10.7. Инструкция WHILE

[begin_labeclass="underline" ]

WHILE search_condition DO statement_list

END WHILE

[end_label]

Операторный список внутри инструкции WHILE повторен, пока search_condition равно true. Инструкция WHILE может быть помечена. Пример:

CREATE PROCEDURE dowhile()

BEGIN

DECLARE v1 INT DEFAULT 5;

WHILE v1 > 0 DO

SET v1 = v1 – 1;

END WHILE;

END

5.3. Сохраненные процедуры, функции, триггеры и LAST_INSERT_ID()

Внутри тела сохраненной подпрограммы (процедуры или функции) или триггера значение LAST_INSERT_ID() меняется по обычным правилам. Эффект сохраненной подпрограммы или триггера на значение LAST_INSERT_ID(), который замечен следующими инструкциями, зависит от вида подпрограммы:

Если сохраненная процедура выполняет инструкции, которые изменяют значение LAST_INSERT_ID(), измененное значение будет замечено инструкциями, которые следуют за вызовом процедуры.

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

5.4. Сохраненные процедуры, функции, триггеры и репликация

В MySQL 5.0 сохраненные процедуры и функции работают с репликацией?

Да, стандартные действия, выполненные в сохраненных процедурах и функциях, скопируются. Имеются несколько ограничений, которые описаны подробно в разделе "5.5. Двоичная регистрация сохраненных подпрограмм и триггеров".

Будут ли сохраненные процедуры и функции, созданные на главном сервере, скопированы на подчиненный?

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

Как реплицируются действия, которые происходят внутри сохраненных процедур и скопированных функций?

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

Есть ли специальные требования защиты для использования сохраненных процедур и функций вместе с репликацией?

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

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

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

Обратите внимание: до MySQL 5.0.16 эти ограничения также относятся к сохраненным процедурам, и переменная системы именована log_bin_trust_routine_creators.