Книга: Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Условные блоки
Разделы на этой странице:
Условные блоки
PSQL распознает два типа условных структур:
* ветвление, управляемое блоками IF ... THEN И, возможно, ELSE;
* циклическое выполнение блока, пока условие WHILE не станет ложным.
Начиная с версии 1.5 логические контекстные переменные INSERTING, UPDATING и DELETING и целочисленная контекстная переменная ROW_COUNT доступны в качестве предикатов в блоках, выполняющих операции изменения состояния данных. Подробности использования логических контекстных переменных в триггерах для множества событий см. в главе 31.
Конструкция IF... THEN... ELSE
Конструкция IF ... THEN ... ELSE осуществляет ветвление в программе, проверяя указанное условие. Синтаксис:
IF (<условие>)
THEN <составной-оператор>
[ELSE <составной-оператор>]
<составной-оператор> = {<блок><оператор>;}
Предложение условие является предикатом, который должен быть истинным, чтобы выполнился оператор или блок, следующий за THEN. Необязательное предложение ELSE задает альтернативный оператор или блок, который будет выполняться, если условие окажется ложным. Условие может быть любым правильным предикатом.
! ! !
ПРИМЕЧАНИЕ. Предикат, проверяемый в IF, должен быть заключен в скобки.
. ! .
Когда вы кодируете условный переход в SQL, использование предложения ELSE иногда бывает необходимым для "нейтрализации" в случаях, когда проверяемый в IF предикат может не иметь ни истинного, ни ложного значения. Такое может произойти, когда в предикате во время выполнения сравниваются два пустых (NULL) значения. Логические значения истина и ложь являются в этом случае невозможными. Ветвь ELSE в этом случае является гарантией, что ваш блок выдаст результат.
Следующий фрагмент кода иллюстрирует использование IF ... ELSE в предположении, что FIRST_NAME, LAST_NAME, и LINE2 были ранее объявлены как переменные или аргументы:
. . .
IF (FIRST_NAME IS NOT NOLL) THEN
LINE2 = FIRST_NAME || ' ' || LAST_NAME;
ELSE
BEGIN
IF (LAST_NAME IS NOT NULL) THEN
LINE2 = LASTNAME;
ELSE
LINE2 = 'NO NAME SUPPLIED';
END
. . .
! ! !
СОВЕТ. Программисты языка Pascal, заметьте, что IF ... THEN завершен терминатором!
. ! .
По поводу CASE
Пока PSQL не поддерживает логику CASE В качестве конструкции программирования. Логика выражения CASE, конечно, доступна в DSQL. Подробности см. в главе 21.
Конструкция WHILE... DO
WHILE ... DO является конструкцией цикла, который повторяет оператор или блок операторов, пока условие является истинным. Условие проверяется в начале каждого цикла, WHILE ... DO использует следующий синтаксис:
. . .
WHILE (<условие>) DO
BEGIN
<выполнение одного или более операторов>
<изменение значения операнда в условии> ;
END
/* Здесь продолжение выполнения */
. . .
В следующей простой процедуре WHILE проверяет значение переменной i, которая инициализируется как входной аргумент. Блок цикла уменьшает значение i при каждой итерации, и пока i остается больше нуля, значение выходного параметра r увеличивается на значение i. Когда процедура завершается, значение r возвращается вызвавшему приложению.
SET TERM ^;
CREATE PROCEDURE MORPH_ME (i INTEGER) RETURNS (r INTEGER)
AS
BEGIN
r = 0;
WHILE (i > 0) DO
BEGIN
r = r + i;
i = i - 1;
END
END^
Вызов процедуры из isql:
SQL> EXECUTE PROCEDURE MORPH_ME (16) ;
Мы получаем:
R
========
136
- Блоки
- ГЛАВА 7 Взаимные исключения и условные переменные
- Условные переменные
- 7.2. Взаимные исключения: установка и снятие блокировки
- Статистика по блокировкам
- Создание файлов с блокировкой
- Условные операторы
- Не допускайте того, чтобы поток пользовательского интерфейса блокировался на длительное время
- Часть I Скрываем свое местонахождение и посещаем заблокированные сайты
- Блоки питания, используемые в компьютерах
- ГЛАВА 8 Блокировки чтения-записи
- Не хочу, чтобы компьютером пользовались в мое отсутствие. Как установить пароль и блокировать машину?