Введение в SQL/PSM — объявление переменных, операторы циклов и т.д.
1. Объявление переменных
DECLARE <имя переменной>
[DEFAULT <значение>]
Примечания: переменные могут иметь любой SQL-тип данных (использование доменов не предусмотрено). Особенностью этих переменных является то, что они могут хранить NULL-значения. В SQL Server имя локальной переменной предваряется символом @, а глобальной — @@.
Присвоение значений переменным:
SET <имя переменной>=<выражение>
Примечание: В ряде СУБД присвоение значения локальной переменной производится с помощью оператора SELECT.
2. Управление логикой исполнения
IF <условие> THEN <операторы> [ELSIF <условие> THEN <операторы>] [ELSE <операторы>] END IF
Пример:
IF City IN (‘London’, ‘Boston’) THEN <оператор>;<оператор>;…
ELSIF Snum=1001 THEN <оператор>;<оператор>;… ELSE <оператор>;<оператор>;…
END IF;
3. Операторы циклов
1) Объявление операторов циклов
LOOP <операторы> END LOOP
– не выполняет никакой проверки на завершение.
WHILE <условие> DO <операторы> END WHILE
REPEAT <операторы> UNTIL <условие> END REPEAT
FOR <индекс> IN [REVERSE]
.. DO <операторы> END FOR
2) Примечания
• В начале составного оператора и в конце многих операторов управления логикой исполнения может быть определена метка и использован оператор GOTO для перехода к ней.
• Возможно использование оператора LEAVE (на практике чаще CONTINUE) для досрочного оператора.
• Оператор RESIGNAL (на практике чаще EXIT, в SQL Server – BREAK) позволяет выйти из цикла на следующий за ним оператор.
3) Пример на циклы
DECLARE s Varchar(30);
SET s=(SELECT SName FROM SalesPeople WHERE City=’Rome’);
WHILE LENGTH(s)<30 SET s=s||'.'; - || - сложение строк (строка дополняется точками до конца). END WHILE;
4. Указатели условий
1) Объявление указателя условий
DECLARE <имя условия> CONDITION {FOR SQLSTATE VALUE <код ошибки>|SQLWARNING|NOT FOUND|SQLEXCEPTION}
Примечание:
• SQLSTATE VELUE <код ошибки> — позволяет указать конкретное значение SQLSTATE.
• SQLWARNING – класс SQLSTATE ‘01’.
• NOT FOUND – класс SQLSTATE ‘02’.
• SQLEXCEPTION – класс SQLSTATE, отличный от ‘00’, ‘01’, ‘02’.
2) Оператор обработки условий
DECLARE {CONTINUE|EXIT|UNDO HANDLER FOR <имя условия>} <оператор>
Примечание:
• CONTINUE указывает на продолжение работы непосредственно после оператора, при выполнении которого был вызван данный указатель.
• EXIT указывает на необходимость продолжения работы непосредственно после составного оператора (BEGIN END), к котором вызван данный указатель.
• UNDO указывает на необходимость аннулирования работы предыдущих операторов в составном операторе и продолжения работы сразу после того оператора, который вызвал данный указатель.
3) Пример на указатель условия
BEGIN
DECLARE Ic Integer DEFAULT 1;
DECLARE FTrue Integer DEFAULT 0;
WHILE FTrue=0 DO BEGIN ATOMIC
DECLARE BadOp CONDITION FOR SQLSTATE VALUE ‘40003’;
DECLARE UNDO HANDLER //повтор до 3-х раз добавления строк
FOR BadOp //BadOp – имя условия
BEGIN
IF Ic>3 THEN RESIGNAL; END IF; //BREAK
SET Ic=Ic+1;
END;
INSERT INTO Customer VALUES (2009, ‘Hammer’, ‘New York’, 150);
INSERT INTO Orders VALUES (3012 109.86, 15/12/1999, 2009, 1007);
SET FTrue=1;
END; END WHILE;
END;
5. Оператор FOR
FOR <имя курсора> AS <запрос> DO <операторы> END FOR
Примечание: оператор FOR неявным образом открывает курсор, осуществляет выборку строк курсора и исполняет тело оператора FOR по одному разу для каждой строки, а затем закрывает курсор. <имя курсора> можно использовать для обновления и удаления строк курсора. В СУБД InterBase|Firebird <имя курсора> не указывается.
Пример на оператор FOR:
DECLARE s Varchar(300) DEFAULT ‘’;
FOR CurSP AS SELECT * FROM SalesPeople WHERE SNum>=1001 DO
IF s<>’’ THEN SET s=s||’,’;
END IF;
SET s=s||City;
END FOR;