Любой из этих типов переменных может быть использован в теле хранимой процедуры везде, где может появиться выражение. Им может присваиваться значение литерала или значения, полученного из запроса или в результате вычисления выражения.
Поскольку определение доменов потенциально может быть изменено, они не могут быть использованы на месте собственных типов данных 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 и выполняет автоматическое преобразование типов в некоторых случаях, желательно использовать явное преобразование, чтобы избежать непредвиденных несоответствий типов.
Более подробную информацию о явном преобразовании и о конвертировании типов данных см. в главах 8 и 21.
Локальные переменные объявляются, каждая в отдельной строке, до первого оператора BEGIN. Они не имеют значения вне хранимой процедуры или триггера, их область действия не распространяется на другие вызываемые процедуры. Они должны быть объявлены до их использования.
Вам следует всегда инициализировать ваши переменные насколько возможно раньше в вашей процедуре. В Firebird 1.5 вы можете объявлять и инициализировать переменную в одном операторе. Например, каждый следующий оператор допустим для объявления переменной вида счетчик и инициализации ее нулем:
. . .
DECLARE VARIABLE COUNTER1 INTEGER DEFAULT 0;
DECLARE VARIABLE COUNTER2 INTEGER = 0;
Следующая процедура иллюстрирует фрагмент австралийской шутки о правильности пословицы: "Никогда не ешь свинину, если в названии месяца есть буква R". Она возвращает мнение по поводу полученной даты. Для иллюстрации в ней объявляется одна локальная переменная, которая используется для получения стартового условия для цикла WHILE, и другая - для управления количеством повторов цикла.
CREATE PROCEDURE IS_PORK_SAFE (CHECK_MONTH DATE)
RETURNS (RESPONSE CHAR(3))
AS
DECLARE VARIABLE SMONTH VARCHAR(9);
DECLARE VARIABLE SI SMALLINT;
BEGIN
SI = 0;
RESPONSE = ' NO'
SELECT
CASE (EXTRACT (MONTH FROM :CHECK MONTH) )
WHEN 1 THEN 'JANUARY'
WHEN 2 THEN ' FEBRUARY'
WHEN 3 THEN 'MARCH'
WHEN 4 THEN 'APRIL'
WHEN 5 THEN 'MAY'
WHEN 6 THEN 'JUNE'
WHEN 7 THEN ' JULY'
WHEN 8 THEN 'AUGUST'
WHEN 9 THEN 'SEPTEMBER'
WHEN 10 THEN 'OCTOBER'
WHEN 11 THEN 'NOVEMBER'
WHEN 12 THEN 'DECEMBER'
END
FROM RDB$DATABASE
INTO :SMONTH;
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
END ^
COMMIT ^
SET TERM;^
Можно ли автору есть свинину в ее день рождения?
EXECUTE PROCEDURE IS_PORK_SAFE ('2004-05-16');
RESPONSE
=========
NO
! ! !
СОВЕТ. Если бы это была серьезная процедура, в SQL есть более быстрый способ получения того же результата. Например, вместо цикла WHILE вы можете просто проверить переменную SMONTH:
IF (SMONTH CONTAINING 'R') THEN RESPONSE = 'YES' ELSE RESPONSE = 'NO'
Вероятно, вы захотите использовать внешнюю функцию для получения названия месяца. В версии 1.5 вы можете инициализировать переменные при их объявлении.
. ! .
Входные аргументы (также называемые параметрами) используются для передачи значений от приложения процедуре или от одного модуля PSQL другому. Они объявляются списком в скобках следом за именем процедуры и отделяются друг от друга запятыми. Один раз объявленные, они могут использоваться в теле процедуры везде, где могут появиться выражения.
Например, следующий фрагмент процедуры определяет один входной параметр, чтобы сообщить процедуре, какая страна должна отыскиваться:
CREATE PROCEDURE SHOW_JOBS_FOR_COUNTRY (
COUNTRY VARCHAR(15))
. . .