Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Шрифт:
! ! !
ПРИМЕЧАНИЕ. Предикат, проверяемый в 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 завершен терминатором!
. ! .
Пока PSQL не поддерживает логику CASE В качестве конструкции программирования. Логика выражения CASE, конечно, доступна в DSQL. Подробности см. в главе 21.
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
Переменные
Пять типов переменных может быть использовано в теле модуля с некоторыми ограничениями в соответствии с тем, является модуль хранимой процедурой или триггером.
* Локальные переменные для хранения значений используются только в триггерах и хранимых процедурах.
* Контекстные переменные NEW.имястолбца и OLD.имястолбца
* Другие контекстные переменные, специфичные в PSQL, также доступны в isql и PSQL.
* Входные аргументы используются для передачи значений хранимым процедурам из клиентских приложений, других хранимых процедур и триггеров. Недоступны в триггерах.
* Выходные аргументы используются для возвращения значений из хранимых процедур вызвавшим их объектам. Недоступны в триггерах.
Любой из этих типов переменных может быть использован в теле хранимой процедуры везде, где может появиться выражение. Им может присваиваться значение литерала или значения, полученного из запроса или в результате вычисления выражения.
Поскольку определение доменов потенциально может быть изменено, они не могут быть использованы на месте собственных типов данных SQL при объявлении переменных и аргументов хранимых процедур. Модули PSQL компилируются в двоичную форму во время их создания, и изменения доменов разрушат их, если допустить использование доменов.
В операторах SQL задавайте для имен переменных префикс в виде двоеточия (:), когда:
* переменная используется в операторе SQL;
* переменная получает значение в конструкции [FOR] SELECT ... INTO.
Опускайте двоеточие во всех других ситуациях.
! ! !
ПРИМЕЧАНИЕ. Никогда не задавайте префикс двоеточия для контекстных переменных.
. ! .
Процедура присваивает значения переменным с использованием синтаксиса:
переменная = выражение;
выражение может быть любой допустимой комбинацией переменных, операторов и выражений, оно может содержать вызовы внешних функций (UDF) и функций SQL, включая функцию GEN_IDO для увеличения и получения значения генератора.
Следующий фрагмент кода выполняет некоторые присваивания:
. . .
WHILE (SI < 9) DO
BEGIN
SI = SI + 1; /* арифметическое выражение */
IF (SUBSTRING(SMONTH FROM 1 FOR 1) = 'R') THEN
BEGIN
RESPONSE = 'YES'; /* простая константа */
LEAVE;
END
SMONTH = SUBSTRING(SMONTH FROM 2); /* функциональное выражение */ END
. . .
Переменным и аргументам должны присваиваться значения того типа данных, с каким они были объявлены. Числовым переменным должны присваиваться числовые значения, а строковым - строковые значения. Хотя Firebird и выполняет автоматическое преобразование типов в некоторых случаях, желательно использовать явное преобразование, чтобы избежать непредвиденных несоответствий типов.