Основные управляющие структуры — КиберПедия 

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

Основные управляющие структуры

2022-12-20 16
Основные управляющие структуры 0.00 из 5.00 0 оценок
Заказать работу

Ветвление программы

Предложение IF-THEN

IF условие THEN

           Программный код

END IF;

 

Существуют рекомендации избегать предложений IF-THEN, отдавая для ясности кода предпочтение равносильной записи:

 

IF условие THEN

           Программный код

ELSE

           NULL;

END IF;

 

 

Предложение IF-THEN-ELSE

IF условие THEN

           Программный код в случае TRUE

ELSE

           Программный код в случае FALSE/ NULL

END IF;

 

 

Предложение IF-THEN-ELSIF

IF условие1 THEN

           Программный код1

ELSIF условие2 THEN

           Программный код2

           …

ELSIF условие N THEN

           Программный код N

[ELSE

           Программный код в случае FALSE/ NULL ]

END IF;

 

 

Предложения CASE

Начиная с версии 9. 

 

По аналогии с CASE-выражениями имеет две разновидности:

 

CASE

WHEN условие1 THEN

Программный код1

 [WHEN условие N THEN

Программный кодN ] …

[ELSE

Программный код ]

END CASE;

 

Вторая разновидность:

 

CASE выражение

WHEN выражение_для_сравнения1 THEN

Программный код1

 [WHEN выражение_для_сравнения N THEN

Программный кодN ] …

[ELSE

Программный код ]

END CASE;

 

Если конструкция ELSE отсутствует, порождается исключительная ситуация. Выдадим в SQL*Plus:

 

SQL> VARIABLE n NUMBER

 

Следующие примеры вызовут ошибку:

 

BEGIN CASE WHEN FALSE THEN:n:= 1; END CASE; END;

/

 

BEGIN CASE:n WHEN 1 THEN:n:= 2; END CASE; END;

/

 

Следующие примеры не приведут к ошибке:

 

BEGIN CASE WHEN TRUE THEN:n:= 1; END CASE; END;

/

 

BEGIN CASE:n WHEN 1 THEN:n:= 2; END CASE; END;

/

 

BEGIN CASE WHEN FALSE THEN:n:= 1; ELSE:n:= 2; END CASE; END;

/

 

 

Безусловная передача управления

GOTO имя_метки;

 

Формат метки:

 

<< имя_метки >> предложение;

 

где предложение, в частности,может быть NULL.

 

Ограничения области действия GOTO:

 

n нельзя передавать управление внутрь предложения IF, LOOP и вложенного блока

n нельзя передавать управление из одного раздела предложения IF в другой

n нельзя передавать управление извне/внутрь подпрограммы

n нельзя передавать управление из раздела обработки исключительных состояний в основной раздел блока PL/SQL

n нельзя передавать управление из основного раздела блока PL/SQL в раздел обработки исключительных состояний (это можно делать только с помощью RAISE)

 

Обратите внимание, что передавать управление изнутри предложения IF, LOOP и вложенного блока вовне возможно, например:

 

SQL> BEGIN IF TRUE THEN GOTO a; END IF; <<a>> NULL; END;

2 /

 

PL/SQL procedure successfully completed.

 

 

Циклы

Простой цикл

LOOP

           Программный код

END LOOP;

 

Выход из цикла может осуществляться с помощью GOTO, однако правильнее это делать с помощью специальных операторов EXIT или EXIT WHEN:

 

BEGIN

LOOP DBMS_OUTPUT.PUT_LINE ('Enough!'); EXIT; END LOOP;

END;

/

 

 

Счетный цикл (FOR)

FOR индекс_цикла IN [REVERSE] нижнее_значение.. верхнее_значение

LOOP

Программный код

END LOOP;

 

индекс_цикла заводится в PL/SQL автоматически как переменная типа PLS_INTEGER, и объявлять его не требуется. нижнее_значение и верхнее_значение могут быть переменными, вычисление которых производится один раз при входе в цикл.

 

Пример, поясняющий область действия переменной цикла и возможность явного ухода из цикла FOR (обратите внимание, что значение переменной цикла в последнем случае не сохраняется, и если это нужно, потребуется прежде выхода сделать присвоение внешней переменной):

 

DECLARE i NUMBER:= 10;

BEGIN

FOR i IN 1.. 5 LOOP DBMS_OUTPUT.PUT_LINE (i); END LOOP;

DBMS_OUTPUT.PUT_LINE (i);

FOR i IN 1.. 5 LOOP DBMS_OUTPUT.PUT_LINE (i); EXIT; END LOOP;

DBMS_OUTPUT.PUT_LINE (i);

END;

/

 

 

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

FOR индексная_запись IN [ имя_курсора | явное_ предложение_ SELECT ]

LOOP

Программный код

END LOOP;

 

Объявление индексной_записи в PL/SQL выполняется автоматически и с типом имя_курсора %TYPE и самостоятельного объявления не требует.

 

Кроме того, в цикле такого рода автоматически:

 

n открывается курсор

n извлекаются данные при прохождении цикла

n курсор закрывается по выходу из цикла

 

Примеры см. ниже.

 

 

Цикл WHILE

WHILE условное выражение

LOOP

Программный код

END LOOP;

 

 

Имитация цикла REPEAT UNTIL

Цикл REPEAT UNTIL в PL/SQL непосредственно не поддерживается, однако его можно просто сымитировать следующим образом:

 

LOOP

           Программный код

           EXIT WHEN условное выражение

END LOOP;

 

 

Метки в циклах и в блоках

Для повышения надежности кода циклы можно размечать метками, например:

 

BEGIN

<< year_loop >>

FOR year IN 1993.. 2003 LOOP

<< month_loop >>

FOR month IN 1.. 12 LOOP

  IF year_loop.year = 2000 AND month = 1

  THEN EXIT year_loop;

  END IF;

END LOOP month_loop;

DBMS_OUTPUT.PUT_LINE ('Year ' || year || ' gone');

END LOOP year_loop;

DBMS_OUTPUT.PUT_LINE ('Year 2000 have come!');

END;

/

 

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

 

<< outer >>

DECLARE i INTEGER:= 1;

BEGIN

<< inner >>

DECLARE i INTEGER:= 2;

BEGIN

  DBMS_OUTPUT.PUT_LINE (i);    -- outer или inner? 1 или 2?

  DBMS_OUTPUT.PUT_LINE (outer. i);

  DBMS_OUTPUT.PUT_LINE (inner. i);

END;

END;

/

 

К сожалению размечивание циклов и блоков сопособно иногда приводить к недоразумению из-за совпадения имен. Сравните примеры:

 

SQL> BEGIN DBMS_OUTPUT.PUT_LINE (user); END;

2 /

SCOTT

 

PL/SQL procedure successfully completed.

 

SQL> DECLARE user VARCHAR2 (10) := 'tiger';

2 BEGIN DBMS_OUTPUT.PUT_LINE (user); END;

3 /

Tiger

 

PL/SQL procedure successfully completed.

 

SQL> <<standard>> DECLARE user VARCHAR2 (10):= 'tiger';

2 BEGIN DBMS_OUTPUT.PUT_LINE (standard.user); END;

3 /

Tiger

 

PL/SQL procedure successfully completed.

 

SQL> <<nonstandard>> DECLARE user VARCHAR2 (10):= 'tiger';

  2 BEGIN DBMS_OUTPUT.PUT_LINE (standard.user); END;

3 /

SCOTT

 

PL/SQL procedure successfully completed.

 

SQL> <<standard>> DECLARE user VARCHAR2 (10):= 'tiger';

2 BEGIN DBMS_OUTPUT.PUT_LINE (sys.standard.user); END;

3 /

SCOTT

 

PL/SQL procedure successfully completed.

 

 

Подпрограммы

Локальные подпрограммы

Внутри блока PL/SQL могут объявляться собственные подпрограммы, невидимые снаружи блока, но в остальном обладающие практически всеми свойствами обычных (хранимых) подпрограмм.

 

Пример определения локальной функции:

 

DECLARE

FUNCTION day (d DATE) RETURN VARCHAR2 IS

BEGIN RETURN TO_CHAR (d, 'Day');

END;

BEGIN

DBMS_OUTPUT.PUT_LINE (day (SYSDATE));

DBMS_OUTPUT.PUT_LINE (day (SYSDATE + 1));

DBMS_OUTPUT.PUT_LINE (day (SYSDATE + 2));

END;

/

 

Объявление локальных подпрограмм должно выполняться в конце раздела объявлений. Допускается использование переменных того же уровня:

 

DECLARE

a NUMBER:= 5;

PROCEDURE summa (b NUMBER) IS

BEGIN a:= a + b;

END;

BEGIN

summa (1); DBMS_OUTPUT.PUT_LINE (a);

summa (9); DBMS_OUTPUT.PUT_LINE (a);

a:= 1.5;

summa (9); DBMS_OUTPUT.PUT_LINE (a);

END;

/

 

Подпрограммы в PL/SQL не запрещают рекурсивное обращение к себе, и при исполнении глубина рекурсии не регламентируется. Это накладывает на разработчика ПО ответственность слежения за недопущением «бесконечной» рекурсии.

 

 


Поделиться с друзьями:

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.039 с.