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