Читаем Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ полностью

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

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

Поскольку определение доменов потенциально может быть изменено, они не могут быть использованы на месте собственных типов данных 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))

. . .

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных