Книга: 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

Оглавление книги


Генерация: 0.734. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз