Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ИОСУ часть 2 _PLSQL.doc
Скачиваний:
14
Добавлен:
10.11.2019
Размер:
1.48 Mб
Скачать

Управляющие структуры pl/sql

Секция выполнения содержит код, реализующий функциональность блока. Код может представлять собой как любую команду SQL, так любую управляющую структуру PL/SQL.

Секция выполнения блока PL/SQL состоит из одной или более логических команд. Каждая команда завершается разделителем – точкой с запятой. Физический маркер конца строки в программе PL/SQL игнорируется компилятором (воспринимается только как завершение однострочного комментария, который начинается символами --).

Условные управляющие операторы. PL/SQL включает в себя три разновидности команды IF-THEN-ELSE, а также команду и вырвжение CASE. Синтаксис CASE появился только в версии Oracle9i.

IF-THEN-ELSE позволяет реализовать в программах условную логику.

1 вид: конструкция IF-THEN:

IF условие THEN

Выполняемая команда(ы)

END IF;

2 вид: конструкция IF-THEN-ELSE:

IF условие THEN

Последовательность выполняемых команд

ELSE

Последовательность выполняемых команд

END IF;

3 вид: конструкция IF_THEN ELSIF:

IF условие-1 THEN

ELSIF условие-N THEN

Команды-N

[ELSE

else_команды]

END IF;

CASE (команда) позволяет выбрать для выполнения одну последовательность команд из множества предложенных последовательностей.

CASE выражение-переключатель

WHEN выражение_для_значения THEN действие;

[WHEN выражение_для_значения THEN действие;...]

[ELSE действие;]

END CASE;

Команда CASE похожа на команду IF-THEN-ELSIF. Но в команде CASE выражение-переключатель следует непосредственно с ключевым словом CASE. Выражение вычисляется и сравнивается со значением каждой инструкции WHEN. Как только операция сравнения возвращает значение TRUE, управление передаётся команде, следующей за END CASE.

Если выражение-переключатель вычислено как NULL, то ему будет соответствовать только инструкция ELSE.

Инструкция WHEN NULL не будет соответствовать никакому значению, т.к. сервер Oracle выполняет проверку равенства выражений.

И команда, и выражение CASE должны включать в себя инструкцию ELSE, которая будет выполнена в случае, если ни одна из инструкций WHEN не будет оценена как TRUE, т.к. в случае отсутствия совпадения процессов PL/SQL выдаст ошибку.

CASE(выражение)

CASE

WHEN Выражение=выражение_для_значения THEN

Действие;

[WHEN выражение=выражение_для_значения THEN

Действие;…]

[ELSE

Действия;]

END CASE;

В отличие от команды CASE выражение CASE не содержит выражения-переключателя; вместо этого каждая инструкция WHEN содержит полное булево выражение. Выполняется первое подходящее выражение WHEN, затем управление переходом к команде, следующей за END CASE.

Команды управления последовательностью выполнения. Существуют два типа команд управления последовательностью выполнения: GOTO и NULL.

GOTO выполняет безусловный переход к указанной метке.

GOTO имя метки;

Обычно применять команду GOTO не рекомендуется. Если она используется, то за указанной меткой должна следовать хотя бы одна команда (при необходимости этой единственной выполняемой командой может быть команда NULL).

На применение команды GOTO накладываются следующие ограничения:

  • невозможен переход из команды IF, LOOP или вложенного блока;

  • невозможен переход в команду IF, LOOP или вложенный блок;

  • невозможен переход их одной секции команды IF в другую (из секции IF/THEN в секцию ELSE);

  • невозможен переход из и в подпрограмму;

  • невозможен переход из секции обработки исключений в выполняемую секцию блока PL/SQL;

  • невозможен переход из выполняемой секции в секцию обработки исключений блока PL/SQL, хотя такой переход осуществляется командой RAISE.

NULL – это команда, которая ничего не делает.

NULL;

Команда NULL полезна, когда нужна выполняемая, но ничего не делающая команда после метки. Также она может применяться для улучшения читаемости структуры IF-THEN-ELSE.

Команды цикла. Структура LOOP позволяет многократно выполнять последовательность команд. Существуют три вида циклов: простой цикл и циклы WHILE и FOR; при этом FOR имеет две разновидности: цикл со счётчиком и цикл по курсору.

Все циклы могут иметь метку или включать в себя команду EXIT.

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

Команда EXIT применяется для прерывания цикла и передачи управления команде, следующей за END LOOP. Синтаксис команды EXIT:

EXIT [WHEN логическое_условие];

Если в команду EXIT не включена инструкция WHEN, то цикл будет немедленно завершён командой. В противном случае цикл закончится только в случае, если значение выражения логическое_условие будет вычислено как TRUE. Команда EXIT является необязательной и может присутствовать в любой точке цикла.

Простой цикл

LOOP

Выполняемая команда(ы)

END LOOP;

При простейшей конструкции такой цикл состоит только из команд цикла LOOP и END, между которыми должна быть заключена хотя бы одна выполняемая команда. Простой цикл обычно применяется, если необходимо гарантировать хотя бы однократное выполнение тела цикла. Такой цикл завершается только когда в его теле будет выполнена команда EXIT или EXIT WHEN (или не будет обработано порожденное в нём исключение). Если этого не произойдёт, то цикл будет выполняться бесконечно.

Цикл for со счётчиком

FOR переменная_цикла IN [REVERSE] наименьшее_число..наибольшее_число

LOOP

Выполняемая команда (ы)

END LOOP;

Традиционный цикл со счётчиком, в котором указывается количество повторений. Процессор PL/SQL автоматически объявляет переменную цикла с типом PLS_INTEGER. Значения наименьшее_число и наибольшее_число могут быть переменными, но вычисляются они только один раз – при первом входе в цикл. Ключевое слово REVERSE означает, что выполнение начнётся со значения наибольшее_число и будет происходить по убыванию вплоть до значения наименьшее_число.

Цикл FOR по курсору

FOR переменная_запись IN {имя_курсора | (SELECT команда)}

LOOP

Выполняемая команда(ы)

END LOOP;

Цикл, определяемый явным курсором или командой SELECT. Этот тип цикла автоматически открывает курсор, выбирает все, определяемые им строки и закрывает.

Процесcор PL/SQL автоматически объявляет переменную цикла как запись типа имя_курсора%ROWTYPE, об этом необходимо помнить и не объявлять самим переменную с таким же именем.

Цикл WHILE

WHILE условие

LOOP

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