GOTO

Оператор GOTO

Оператор goto дозволяє здійснювати безумовний перехід і має наступний синтаксис:

GOTO label;

Оператор goto здійснює перехід до оператора, позначеного міткою label. Це може бути як оператор begin, так і будь-який з циклів: while, repeat та loop. Крім того, мітка може бути не прив'язана ні до одного з операторів процедури, а оголошена за допомогою оператора label, який має наступний синтаксис:

LABEL label;

У загальному випадку використання операторів goto і label може виглядати так, як це представлено у прикладі.

Приклад:

CREATE PROCEDURE binrand ()

BEGIN

LABEL labelname;

...

GOTO labelname;

END

Оператор LABEL не виконує ніяких дій - завдання цього оператора просто оголосити мітку labelname. На місці цього оператора можна помістити будь-який оператор, що допускає використання в своєму складі мітки (BEGIN, WHILE, REPEAT та LOOP). Досягаючи оператора GOTO, процедура слідує до посилання і переходить назад до мітки labelname. Таким чином, у прикладі реалізований безкінечний цикл. Зазвичай перехід по мітці GOTO використовують спільно з оператором IF, так як це продемонстровано в наступному прикладі, де представлена ??реалізація процедури binrand () з використанням оператора безумовного переходу GOTO.

Приклад:

CREATE PROCEDURE binrand ()

LANGUAGE SQL

BEGIN

DECLARE i INT DEFAULT 0;

DECLARE bin TINYTEXT DEFAULT ’’;

LABEL wet;

SET i = i + 1;

IF RAND() >0.5 THEN SET bin = CONCAT(bin, '1');

ELSE SET bin = CONCAT(bin, '0');

END IF;

IF(i < 20) THEN GOTO wet;

END IF;

SELECT bin;

END //

CALL binrand () //

bin

00001010001110111100

Однак використовувати оператор GOTO для реалізації циклів не рекомендується, тому що звичайні цикли набагато наочніше і простіше піддаються модифікації, до того ж у них складніше допустити логічну помилку.

Часто взагалі рекомендується не використовувати оператор GOTO, оскільки він підштовхує до створення погано структурованого коду. Це не виключає можливості створення читабельного та структурованого коду з використанням оператора GOTO, але спокуса неправильної реалізації цього оператора занадто велика. Крім того, будь-який код можна переписати без використання GOTO, деякі сучасні мови програмування (наприклад, РНР), взагалі не включають його у свій склад.