Тема 5: Расширения transact-sql.
Локальные и глобальные переменные. Операторы определения и использования переменных. Табличные переменные. Пример.
T-SQL поддерживается всеми системными БД, предлагающих ряд дополнительных ф-й:
Определение и использование переменных. DECLARE <имя переменной><тип>. DECLARE @x int
Задание значений переменных.
SET <имя переменной>=<значение>. SET @x=10
SELECT <имя переменной>= <запрос> | <значение>. SELECT @x=10 SELECT @x=count(select pname from p). Замечание: если оператор SELECT возвращает несколько значений переменной, должно присваиваться первое возвращаемое им значение.
Определение табличных переменных DECLARE @t table <опис.столбцов >. DECLARE @t table (pname char(10), pnum int, address char(50))
При создании таблиц на табличные переменные можно накладывать такие же ограничения, как и на таблицу.
Пример: создать табличную переменную и записать в нее данные о поставляемой детали с номером 1
DECLARE @pd1 table (pnum int, dnum int, vol int, primary key(pnum,dnum))
INSERT INTO @pd1 SELECT *FROM PD WHERE dnum=1
SELECT * FROM @pd1
DELETE FROM @pd1 WHERE pnum=2
Существуют также заранее определяемые системные переменные (глобальные):
@@ ERROR-возвращает последний код ошибки
@@ ROWCOUNT – возвращает число строк после выполнения последней операции
@@ FETCHSTATUS
____________________________________________________________________________
Условные и циклические конструкции. Пример.
IF… ELSE…
Пример: вывести цену детали болт, если она неизвестна, вывести соответствующее значение.
IF @dprice IS NOT NULL PRINT CONVERT (char(4),@dprice)+’руб’ ELSE PRINT ‘неизвестная цена’
Вместе с оператором IF используется конструкция IF EXISTS … ELSE. Предикат EXISTS возвращает значение истина, если набор к которому он применяется не пустой.
Пример: определить, есть ли сведения о поставщике ‘Иванов’, вывести соответствующее сообщение.
IF EXISTS (SELECT * FROM P WHERE pname= ‘Иванов’) PRINT ‘информация присутствует’ ELSE ‘нет’
Операторные скобки BEGIN …END
Циклические конструкции. Циклы определяются единственным образом: WHILE, для которого существует оператор BREAK для выхода и CONTINUE
WHILE <условие продолжения цикла> BEGIN ..<тело цикла> END
Пример: увеличивать цену в 1.5 раза пока средняя цена < 30 рублей.
WHILE (SELECT AVG(dprice) FROM D)<30 BEGIN UPDATE D SET dprice=1.5*dprice END
Использование выражения CASE. Пример.
Не является самостоятельным оператором, поэтому возвращаемое значение помещается в соответствующую переменную оператором SET, SELECT
CASE <селектор>
WHEN <значение 1> THEN <выход.знач.1>
WHEN <значение 2> THEN <выход.знач.2>
WHEN <значение N> THEN <выход.знач.N>
ELSE <знач.>
Пример: вывести цену заданной детали в валюте задаваемой пользователем.
DECLARE @dnum int
DECLARE @cur char(3) –валюта
SET @dnum=1 SET @cur=’EUR’ DECLARE @dprice money SELECT @dprice=dprice FROM D WHERE dnum=@dnum
SET @dprice= CASE @cur
WHEN ‘руб’ THEN @dprice WHEN ‘$’ THEN @dprice/30 WHEN ‘EUR’ THEN @dprice/40 PRINT @dprice
_____________________________________________________________________________
