Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...
Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...
Топ:
Генеалогическое древо Султанов Османской империи: Османские правители, вначале, будучи еще бейлербеями Анатолии, женились на дочерях византийских императоров...
Теоретическая значимость работы: Описание теоретической значимости (ценности) результатов исследования должно присутствовать во введении...
История развития методов оптимизации: теорема Куна-Таккера, метод Лагранжа, роль выпуклости в оптимизации...
Интересное:
Распространение рака на другие отдаленные от желудка органы: Характерных симптомов рака желудка не существует. Выраженные симптомы появляются, когда опухоль...
Национальное богатство страны и его составляющие: для оценки элементов национального богатства используются...
Инженерная защита территорий, зданий и сооружений от опасных геологических процессов: Изучение оползневых явлений, оценка устойчивости склонов и проектирование противооползневых сооружений — актуальнейшие задачи, стоящие перед отечественными...
Дисциплины:
2022-12-20 | 16 |
5.00
из
|
Заказать работу |
|
|
Ветвление программы
Предложение 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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!