Выбрать главу

Да

Да

POST_EVENT имя-события

Помещает событие имя-события в стек. Имя события может быть произвольной строкой длиной до 78 символов и не является предварительно определенным на сервере. События из стека будут переданы клиентам, "прослушивающим" это событие через обработчик сообщений. Подробности см. в разд. "События" главы 32

Да

Да

SELECT ... INTO ...

Помещает выход обычного одиночного оператора SELECT в список предварительно объявленных переменных. Вызовет исключение, если оператор вернет множество строк

Да

Да

SUSPEND

Недоступен в триггерах! Оператор используется в процедурах, разработанных для вывода наборов множества строк в виде виртуальных таблиц - хранимые процедуры выбора. Он приостанавливает выполнение процедуры на время перемещения строки из кэша строк в клиентское приложение. Оператор не имеет этого эффекта в выполняемых хранимых процедурах, где он эквивалентен оператору EXIT

Да

Да

WHILE <условие> DO

Синтаксис условного цикла, при котором выполняется блок, пока условие не станет ложным. Подробности см. в разд. "Условные блоки" позже в этой главе

Да

Да

WHEN {ошибка [, ошибка . . . ] | ANY}

Синтаксис для обработки исключений. Аргументами могут быть одно или более определенных пользователем исключений или внутренне определенные исключения GDSCODE или SQLCODE. Подробности см. В главе 32

Да

Да

Программные конструкции

В следующих разделах рассматриваются программные конструкции, распознаваемые в PSQL.

Блоки BEGIN ... END

PSQL является структурированным языком. После объявления переменных процедурные операторы заключаются в операторные скобки BEGIN и END. В процессе разработки логики процедуры могут быть добавлены другие блоки; любой блок может включать другой блок, заключенный в BEGIN и END.

Символ терминатора не используется в ключевых словах BEGIN и END, за исключением финального ключевого слова END, который закрывает процедурный блок и завершает оператор CREATE PROCEDURE или CREATE TRIGGER. Это финальное ключевое слово END имеет специальный терминатор, который был определен в операторе SET TERM до начала данного определения.

Условные блоки

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^

Вызов процедуры из isqclass="underline"

SQL> EXECUTE PROCEDURE MORPH_ME (16) ;

Мы получаем:

R

========

136

Переменные

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

* Локальные переменные для хранения значений используются только в триггерах и хранимых процедурах.

* Контекстные переменные NEW.имястолбца и OLD.имястолбца ограничены использованием в триггерах; они хранят новые и старые значения каждого столбца таблицы, когда оператор DML ожидает завершения.

* Другие контекстные переменные, специфичные в PSQL, также доступны в isql и PSQL.

* Входные аргументы используются для передачи значений хранимым процедурам из клиентских приложений, других хранимых процедур и триггеров. Недоступны в триггерах.

* Выходные аргументы используются для возвращения значений из хранимых процедур вызвавшим их объектам. Недоступны в триггерах.

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

Использование доменов