Программирование >>  Построение запросов sql 

1 ... 69 70 71 [ 72 ] 73 74 75 ... 101


<тип переменной> :: = {<тип цанных> имя цомена TYPE OF имя цомена}.

Следует обратить внимание на то, что для каждой переменной используется свой оператор DECLARE VARIABLE, который заканчивается точкой с запятой.

Правило составления имен локальных переменных такое же, как и для любых других идентификаторов языка SQL (см. п. 2.7).

В качестве типа данных можно указывать один из системных типов (см. п. 2.9), ранее созданный домен или конструкцию TYPE OF <имя цомена>, которая извлекает только тип из существующего домена (т.е. ограничения и значения по умолчанию, определенные для данного домена, не учитываются).

Например, чтобы объявить переменную x целого типа, необходимо использовать следующий оператор:

DECLARE VARIABLE x INTEGER;.

Объявить переменную y на домене BOOLEAN можно следующим образом: DECLARE VARIABLE y BOOLEAN;.

Все локальные переменные должны быть объявлены до первого выполняемого блока триггера (процедуры).

Объявленным переменным в дальнейшем могут присваиваться различные значения с помощью оператора присваивания, имеющего следующий синтаксис:

имя локальной переменной = <выражение>;.

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

Допускается при объявлении локальной переменной сразу же ее инициализировать, например следующим образом: DECLARE VARIABLE x INTEGER = 123; или

DECLARE VARIABLE x INTEGER DEFAULT 123;.

СУБД делает доступным множество переменных, поддерживаемых в контексте текущего соединения клиента и его деятельности. Эти контекстные переменные доступны для использования в PSQL. Большинство контекстных переменных процедурного языка используются только в триггерах. Существует только одна контекстная переменная PSQL, которую можно использовать как в триггерах, так и в ХП. Это переменная ROWCOUNT, возвращающая количество строк, полученных выполненным запросом DML или SELECT.

В триггерах для реализации отслеживания целостности данных используются контекстные переменные ОЮ.столбец и NEW.столбец. Эти переменные хранят старые и новые значения указанного столбца таблицы, когда выполняется запрос на модификацию данных.

Также в триггерах могут использоваться логические контекстные переменные UPDATING, INSERTING и DELETING для задания определенных действий в зависимости от типа события DML, для которого срабатывает триггер.



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

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

Говоря о переменных процедурного языка, следует особо отметить то, что в запросах SQL локальные переменные, входные и выходные параметры должны использоваться с двоеточием перед именем переменной, чтобы указать, что это переменные, а не имена столбцов таблиц. В остальных случаях (например, при присваивании значения переменной, в логических условиях условных операторов) не требуется наличия двоеточия перед именем переменной. Двоеточие перед контекстными переменными не ставится никогда.

Примеры практического использования всех четырех типов переменных в модулях на PSQL приведены при изучении ХП и триггеров.

6.1.2. Условные операторы

При программировании на PSQL существует возможность использовать следующие типы условных структур:

- ветвление, управляемое оператором IF THENELSE;

- циклическое выполнение группы операторов, пока условие WHILE не станет ложным.

6.1.2.1. Оператор ветвления IF

Оператор ветвления IF имеет следующий формат:

IF (логическое условие) THEN <группа операторов1> ELSE <группа операторов2>],

где логическое условие - любой предикат, который должен быть истинным, чтобы выполнилась <группа операторов>, следующая за THEN; <группа операторов> { <блок операторов>

DML оператор

оператор процедурного языка FireЫrd };

<блок операторов> BEGIN

<группа операторов>

END.

Блок операторов - это группа операторов SQL, рассматриваемых как единое целое. Блок операторов начинается с зарезервированного слова BEGIN и заканчивается зарезервированным словом END. При этом блок операторов



может содержать вложенный блок операторов, заключенный в операторные скобки BEGIN END, и т.д. Для вложенных блоков после зарезервированного слова END разделительная точка с запятой не ставится. Следует отметить, что между BEGINEND может не быть ни одного оператора, т.е. допустим пустой блок операторов.

Следует отметить, что если <группа операторов> представляет собой один единственный 0М1 оператор или оператор процецурного языка FireЫrd, то заключать данный оператор в скобки BEGIN END не обязательно.

Следующий фрагмент кода иллюстрирует использование оператора IF в теле ХП в предположении, что Street Cod, House Nom, Flat Nom были ранее объявлены как локальные переменные или входные параметры, а Line - как локальная переменная или выходной параметр:

IF (House Nom IS NOT NULL AND Flat Nom IS NOT NULL) THEN Line = Код улицы - Street Cod , д. House Nom , кв. Flat Nom;

ELSE

Line = Street Cod;

Как следует из примера, в конце каждого оператора ставится точка с запятой, в том числе и перед ELSE.

6.1.2.2. Оператор WHILE

Для организации цикла с предусловием можно использовать оператор WHILE, который имеет следующий формат:

WHILE (логическое условие) DO <группа операторов>.

Следующий фрагмент кода иллюстрирует использование в ХП оператора WHILE в предположении, что Digit и Result были ранее объявлены как локальные перменные или параметры:

Result = CAST (Digit as VARCHAR(8));

WHILE (CHAR LENGTH(Result)<8) DO Result = 0 Result;

В этом фрагменте переданное целое число (Digit) преобразовывается в строку из 8 символов (Result), а затем дополняется нулями слева до получения нужного количества символов.

6.1.3. Курсоры в PSQL

При написании хранимых процедур и триггеров очень часто возникает необходимость выбрать информацию из БД перед выполнением каких-либо



1 ... 69 70 71 [ 72 ] 73 74 75 ... 101

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика