Скачиваний:
24
Добавлен:
11.04.2015
Размер:
77.12 Кб
Скачать

27. Процедурные элементы PL/SQL : циклы, условия…

Циклы предназначены для многократного исполнения конкретных операций. В PL/SQL есть 3 типа циклов:

1.Безусловные циклы (бесконечные) - выход из них не предусмотрен. Потому как такие циклы специфичны и применяются редко, то организуются они при помощи условных циклов. Условие возможно вообще не указывать или вместо него применять константу. Примером подобного цикла является машина LOOP ... END LOOP.

LOOP

NULL;

END LOOP

Из таких циклов есть три способа выхода:

EXIT - это безусловный выход. Обычно он используется вместе с оператором IF, в котором проверяется условие выхода.

EXIT WHEN - в этом случае выход осуществляется пр при выполнении условия, описанного после WHEN.

GOTO - в этом случае выход из цикла осуществляется с переходом во внешний контекст, заданный меткой.

2.Условные циклы - команды выполняются прежде тех пор, пока истинно условие. Пример, WHILE условие LOOP ... END LOOP.

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

3.Циклы со счетчиком - цикл, в коем счетчик меняет свое значение с начального прежде конечного с определенным этапом, и для любого значения счетчика выполняется последовательность команд, находящихся в цикле. Представителем данного типа циклов является машина FOR счетчик IN стартовое значение..конечное значение LOOP ... END LOOP.

Oracle поддерживает циклы FOR со счетчиком и с курсором. Для цикла FOR со счетчиком вы указываете начальное и конечное целые значения, а все остальное за вас делает PL/SQL: проходит все значения внутри заданного диапазона и завершает цикл:

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

SELECT:

УСЛОВИЯ:

1)IF – THEN - IF ассоциирует условие с последовательностью операторов, заключенных с помощью ключевых слов THEN и END IF. Если условие истинно, производится действие оператора, а если условие ложно или NULL, то, если оператор не делает ничего.

Синтаксис IF-THEN:

IF condition THEN

S;

END IF;

2) IF-THEN-ELSE – Последовательность операторов IF-THEN может сопровождаться дополнительным ELSE оператором, который выполняется, когда условие ложно.

Синтаксис IF-THEN-ELSE:

IF condition THEN

S1;

ELSE

S2;

END IF;

В IF-THEN-ELSE операторе, когда условие истинно(правда), оператор S1 выполняется ,а S2 пропускается; когда условие ложно, то S1 пропускается, и происходит выполнение оператора S2 .

3) IF-THEN-ELSIF – оператор позволяет Вам выбирать между несколькими переменными. оператор IF-THEN может сопровождаться дополнительным ELSIF ... ELSE оператором. ELSIF позволяет добавлять дополнительные условия.

Синтаксис:

DECLARE

номер (3): = 100;

НАЧАТЬ

IF (= 10), то

dbms_output.put_line ('Значение 10');

ELSIF (= 20) THEN

dbms_output.put_line ('Значение составляет 20');

ELSIF (= 30) THEN

dbms_output.put_line ('Значение составляет 30');

ELSE

dbms_output.put_line ('Ни одно из значений для');

END IF;

dbms_output.put_line ("Точное значение является: '| |);

END;

4) Вложенный IF-THEN-ELSE оператор - Вы можете использовать IF или ELSE IF операторы внутри других IF or ELSE IF операторов.

Пример:

DECLARE

a number(3): = 100;

b number(3): = 200;

BEGIN

- Проверить логическое условие

IF (= 100) THEN

- Если условие истинно, то проверьте следующее

IF (В = 200) THEN

- Если условие истинно затем распечатать следующие

dbms_output.put_line ('Значение в 100 и в 200 б');

END IF;

END IF;

dbms_output.put_line ("Точное значение является: '| |);

dbms_output.put_line ("Точное значение Ь: '| | б);

END;

5) оператор CASE - Как IF оператор, CASE выбирает одну последовательность инструкций для выполнения. Однако, чтобы выбрать последовательность, оператор использует селектор, а не несколько логических выражений. Селектор - выражение, значение которого используется для выбора одного из нескольких вариантов.

Пример:

DECLARE

grade char(1): = 'B';

BEGIN

CASE

when grade= 'A', то dbms_output.put_line («отлично»);

when grade= 'B', то dbms_output.put_line («очень хорошо»);

when grade= 'C', то dbms_output.put_line («Хорошо»);

when grade= 'D', то dbms_output.put_line ('Вы прошли');

when grade= 'F', то dbms_output.put_line («Лучше попробуйте еще:);

ELSE dbms_output.put_line ("Нет такого сорта ');

end case;

END;

26.Оператор SELECT в анонимном блоке(выборка одной строки, обработка курсора в цикле, открытие ссылочного курсора).

С помощью оператора SELECT производится выборка данных из БД . Отличительной особенностью применения оператора SELECT в PL/SQL является то, что для принятия данных, полученных с помощью запроса, используются переменные. Переменные указываются с помощью ключевого слова INTO, которое следует после описания полей запроса.

Запрос одной строки из базы данных

Используется SQL-выражение SELECT, дополненное предложением INTO, в котором указываются переменные, куда запишутся запрошенные данные. Количество и тип этих переменных должны соответствовать количеству и типу полей .

В случае, если запрос вернул нулевое число строк, выбрасывается исключение NO_DATA_FOUND. В случае, если строк больше, чем одна, выбрасывается исключение TOO_MANY_ROWS. Эти исключения, вообще говоря, следует обрабатывать в соответствующей части блока за исключением случаев, когда предполагается, что они не могут быть выброшены.

Например, при запросе данных из таблицы по их первичному ключу обработчик исключения TOO_MANY_ROWS не нужен.

DECLARE

empname VARCHAR2(200);

BEGIN

SELECT ename

INTO empname

FROM scott.emp

WHERE empno = 7439;

EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.put_line('No records found!');

WHEN TOO_MANY_ROWS THEN

DBMS_OUTPUT.put_line('Found more than one string!');

END;

Использование курсора в цикле.

В большинстве ситуаций, которые требуют явного курсора, текст программы может быть упрощен при использовании "курсора в цикле FOR", заменяющего команды OPEN, FETCH и CLOSE. Курсор в цикле FOR:

       неявно объявляет индекс цикла записью, поля которой соответствуют столбцам (псевдонимам) предложения SELECT ... из описания курсора;

       передает параметры курсора (если они есть) и открывает курсор;

       выбирает в цикле строки из полученного набора в индекс цикла (поля записи);

       закрывает курсор после обработки всех строк набора или досрочному выходу из него с помощью команд EXIT или GOTO.

Синтаксис курсора в цикле FOR имеет вид:

 

FOR var_rec_name IN cursor_name [ (value [,value]...) ] LOOP

                  ТЕЛО ЦИКЛА

  END LOOP;

где - var_rec_name индекс цикла, в котором при первом прохождении цикла хранится первая строка набора, при втором прохождении цикла - вторая строка и т.д.;

Список значений ("value") используется для передачи параметров курсора (он заменяет в данном случае список из команды OPEN);

ТЕЛО ЦИКЛА содержит нужные строки повторяющейся части программы, в которых используются переменные с именами var_rec_name.column_name, а column_name имя столбца из перечня столбцов предложения SELECT в описании курсора.

Открытие курсорной переменной для запроса

Для связи курсорной переменной с определенным оператором SELECT

используется расширенный синтаксис оператора OPEN, позволяющий указать требуемый запрос:

OPEN курсорная_переменная FOR onepamop_select;

где курсорная_переменная — это ранее объявленная курсорная переменная, a onepamop_select — ребуемый запрос. Если курсорная переменная ограничена, список выбора должен соответствовать типу, возвращаемому курсором. Иначе выдается сообщение об ошибке:

ORA-6504: PL/SQL: return types of result set variables or query do not match (PL/SQL: не установлено соответствие между возвращаемыми типами переменных результирующего набора и запросом)

В качестве примера рассмотрим курсорную переменную:

DECLARE

TYPE t_ClassesRef IS REF CURSOR RETURN classes%ROWTYPE;

v_ClassesCV t_ClassesRef;

 

Теперь откроем v_ClassesCV:

OPEN v_ClassesCV FOR

SELECT * 'FROM classes;

Если же попытаться открыть v_ClassesCV так:

OPEN v_ClassesCV FOR

SELECT department, course FROM classes;

то будет получено сообщение об ошибке ORA-6504, так как список выбора запроса не соответствует типу, возвращаемому этой курсорной переменной.

Оператор OPEN...FOR, в принципе, аналогичен оператору OPEN: анализируются переменные привязки и определяется активный набор. После выполнения OPEN...FOR можно считывать информацию из курсорной переменной. Считывание может производиться либо на сервере с помощью оператора FETCH (так же, как для обычного курсора), либо на клиенте.

Соседние файлы в папке ответы