КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Условное выполнение.
Конструкция IF…ELSE используется для организации ветвлений внутри процедуры. Ее обобщенная синтаксическая диаграмма выглядит следующим образом:
Примеры использования условных конструкции можно посмотреть в разделе о триггерах – в хранимых процедурах они используются точно так же, за исключением необходимости заключать составные операторы в блоки инструкций.
Циклы.
Еще одним базовым элементом программирования хранимых процедур являются циклические структуры – конструкции для многократного выполнения группы инструкций. Циклы бывают: · Параметрические – со счетчиком итераций (цикл FOR). · С пост- или предпроверкой – условие продолжения цикла проверяется в начале или в конце группы составляющих его инструкций. Обобщенная синтаксическая диаграмма построения циклических конструкций представлена на рисунке ниже:
Для иллюстрации всего вышесказанного создадим хранимые процедуры на диалекте Transact-SQL, использующую оба типа описанных конструкций. Для создания процедуры будем использовать БД “Зарплата”, состоящую из одной таблицы:
Oklad
Теперь предположим, что вышло постановление директора предприятия, в котором сказано, что нужно повысить зарплату сотрудникам, у которых она меньше 6000р., до такого уровня, чтобы средняя зарплата на предприятии была не меньше 5500р. Процедура, реализующая необходимые для этого действия выглядит следующим образом:
CREATE PROCEDURE setNewZarplata AS BEGIN WHILE (SELECT AVG(zarplata) FROM oklad) < 5500 BEGIN UPDATE oklad SET zarplata = zarplata + 200 WHERE zarplata < 6000 END END;
В данной процедуре в принципе блок BEGIN…END в цикле не обязателен, т.к. его тело состоит из одной инструкции SQL, но большинство циклов в Transact-SQL его содержат. Следующая процедура добавит префикс названия предприятия (который передается в процедуру в качестве параметра “@firm_name” ) к названию отдела, которое передается в процедуру в качестве параметра “@otdel_name”), в тех случаях, когда название этого отдела его не содержат. В случае, если название отдела обновлено, процедура возвращает ноль, если же обновление не требуется (название уже содержит нужный префикс) – единицу:
CREATE PROCEDURE setNewOtdelsNames @firm_name CHAR(20) @otdel_name CHAR(20) AS BEGIN IF (SUBSTRING(@otdel_name, 1, LEN(@firm_name)) <> @firm_name) THEN BEGIN UPDATE oklad SET otdel = @firm_name || otdel WHERE otdel = @otdel_name RETURN 0 END ELSE BEGIN RETURN 1 END END;
Приведенная выше процедура использует две встроенные в MS SQL Server функции: · SUBSTRING(str, index, count) – возвращает <count> символов из исходной строки <str>, начиная с символа с номеров <index>. · LEN(str) – возвращает длину строки <str>.
Также в данной процедуре используется операция конкатенации (“слияния”) строк, которая в MS SQL Server обозначается символами || (две подряд идущие вертикальные черты). Более полные сведения по функциям, операторам и другим возможностям MS SQL Server и диалекта Transact-SQL можно получить в поставляемой вместе с ним справке. В MS SQL Server 2000 это файл “TSQLREF.CHM”.
|