Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Высокоуровневые методы программирования..pdf
Скачиваний:
10
Добавлен:
15.11.2022
Размер:
10.32 Mб
Скачать

Данный запрос также является перекрестным. Источником строк его является поле Podrazd, а источником столбцов - данные, возвращаемые подзапросами с псевдонимами «Цилиндр», «Вал» и «Подшипник», ко­ торые описаны в секции SELECT. Для фильтрации данных, относящихся к определенной категории продукции, используется шаблон Like (по подо­ бию), а для расчета применяется агрегатная функция Sum, аргументом кото­ рой выступает скалярное выражение (w.obem-w.brak)*w.cena. Связь данных внешнего запроса с данными подзапросов производится через маску р таб­ лицы t Podrazd по полю id. В каждом подзапросе используется информация из таблиц t_People pe,t_work w,t_kateg к, поэтому в предикате where под­ запросов, помимо фильтрации по шаблону, описаны условия внутреннего объединения данных из указанных таблиц.

3.2.Создание

ииспользование представлений

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

Приведем команду, обеспечивающую создание представления Реор1е_ work;

Create View People_work(OaMHnHn, Стоимость, Объем, Брак, Дата) As

Select p.Fam,w.cena*w.obem,w.obem,w.Brak,d.dataw From T_people p,T_work w,T_dataw d

Where p.id=w.id_people and d.id=w.id_dataw

Это представление объединяет данные из таблиц T_people, T_work и T_dataw. Характерной особенностью этого представления является то, что в секции SELECT имена не задаются, но они есть в скобках, после имени созда­ ваемого представления.

Для вывода объединенной информации используется команда, пред­ ставленная на рис. 3.12.

Select * from People_work

 

|фамилия Стоимость

Объем . Б рак1Дата

1

.Гришин

2002 .5 0 0 0 0

1 0 .0

2 .0 2 0 0 8 -0 1 -2 1

2

Климов

1802

.25000

9 .0

.0

2 0 0 8 -0 1 -2 1

3

; Иванов

1604

.54000

3 .5

.5

2 0 0 8 -0 1 -2 1

4

Петров

2 4 97

.46000

7 .0

1 .0 2 0 0 8 -0 1 -2 1

5

Сидоров 2 8 7 0

.24000

8 .0

1 .0 2 0 0 8 -0 1 -2 1

6

Гришин

2420

.4 4 0 0 0

11 .0

3 .0 2 0 0 8 -0 1 -2 3

7

Иванов

1842

.28000

4 .0

.0

2 0 0 8 -0 1 -2 3

8

Сидоров 2 8 54 .24000

8 .0

2 .0 2 0 0 8 -0 1 -2 3

9

Гришин

2 6 4 0

.48000

12 .0

.0

2 0 0 8 -0 1 -2 5

10

Гришин

2200

.4 0 0 0 0

10 .0

2 .0 2 0 0 8 -0 1 -2 5

11

Сидоров 2511 .4 6 0 0 0

7 .0

.0

2 0 0 8 -0 1 -2 5

Puc. 3.12. Вывод информации из представления People_work

На рис. 3.13 показаны примеры фильтрации данных, получаемых на осно­ ве представления People_work.

Select * from People_work where Фамилия Like '%Гриш%'

 

Фамилия Стоимость

Объем Брак Дата

1

Гришин

2 0 02 .50000

1 0 .0

2 .0

2 0 0 8 -0 1 -2 1

2

Гришин

2 4 2 0 .44000

1 1 .0

3 .0

2 0 0 8 -0 1 -2 3

3

Гришин

2 6 40 .48000

1 2 .0

.0

2 0 0 8 -0 1 -2 5

4

Гришин

2200 .4 0 0 0 0

1 0 .0

2 .0

2 0 0 8 -0 1 -2 5

Select * from People work where Брак=0

_______________________

 

|Фамилия

Стоимость

Объем Брак Дата

1

Климов

1802 .25000

9 .0

.0

2 0 0 8 -0 1 -2 1

2

Иванов

1842 .28000

4 .0

.0

2 0 0 8 -0 1 -2 3

3

Гришин

2640

.48000

12 . 0

.0

2 0 0 8 -0 1 -2 5

4

Сидоров 2511

.46000

7 .0

.0

2 0 0 8 -0 1 -2 5

Рис. 3.13. Примеры фильтрации данных, возвращаемых представлением People_work

Таким образом, прежде чем создавать представление, необходимо протес­ тировать запрос, чтобы убедиться, что он возвращает правильный набор. Затем запомнить схему запроса, создав объект представления. После чего к этому объ­ екту можно обращаться и выбирать данные так же, как из обычной таблицы.

3.3.Команды манипуляции данными

Ккомандам манипуляции данными относятся оператор вставки новых записей Insert, оператор обновления данных Update и оператор удаления уста­ ревших записей Delete. Рассмотрим особенности использования этих команд

на нескольких примерах. Команда Insert

Insert Into T_people (fam,datar,id_Podrazd) Values (‘Егоров’,’25.01.1990’,2);

Insert into T_people2

Select *

From T_people

Where fam between ‘A’ and ‘K’

Здесь команда Insert первая обеспечивает добавление одной новой записи

втаблицу Т_реор1е. В результате к этой таблице будет добавлена 6-я запись

оработнике Егорове, который родился 25.01.1990 и работает в цехе № 72. Вто­ рой пример обеспечивает копирование в таблицу Т_реор1е 2 всех работников, фамилии которых начинаются на буквы от А до И, если таблица Т_реор1е2 совпадает по структуре с таблицей Tjpeople.

На рис. 3.14 представлены примеры использования команд обновления данных. В отличие от классического синтаксиса, такие команды в языке Trans­ act-SQL могут иметь секцию FROM, что при выполнении операции обновле­ ния позволяет использовать данные из разных связанных таблиц.

Update Twork Set cena=220.04

From T work w,T_kateg k Where k.id=w.id_kateg and

k.Kateg Like '%подш%

.

Update T work

(

aet сепа=э /U.4U4,

\i

Brak=0

From T work w,T_kateg k Where k.id=w.id_kateg and k.Kateg Like '%цилиндр%

 

id i id_kateg

id_ Dataw id_ people

Obexn Cena

Bra>

1

1

1

1

1

10.0

220.0400

2.0

2

2

1

1

3

9.0

220.0400

.0

3

3

2

1

2

3.S

458.4400

.5

4

4

3

1

4

7.0

370.4040

.0

5

5

3

1

S

8.0

370.4040

.0

6

6

 

2

1

11.0

220.0400

3.0

7

7

2

2

2

4.0

460.5700

.0

8

8

3

2

5

8.0

370.4040

.0

9

9

1

3

1

12.0

220.0400

.0

10

10 1

3

1

10.0

220.0400

2.0

11

11 3

3

S

7.0

370.4040

.0

Рис. 3.14. Примеры использования команды UPDATE

Команда удаления устаревших записей DELETE с точки зрения возможностей использования ничем не отличается от классических вариантов применения.

ЛЕКЦИЯ 4. ПРОЦЕДУРНЫЙ TRANSACT-SQL

Познакомившись с основными командами Transact-SQL, мы рассмотрели только простейшие возможности взаимодействия разработчика БД с сервером. Всего в Microsoft SQL Server имеются 4 типа процедурных элементов:

-триггеры - отвечают за механизмы каскадирования.

-функции пользователя - выполняют расчеты, а в качестве результата возвращают единственное значение (однако не всегда).

-хранимые процедуры - предназначены для выполнения полнофункциональных преобразований. В качестве результата могут возвращать один или несколько наборов данных.

-пакеты - подпрограммы, предназначенные для преобразования данных или информационных структур (запускаются администратором сервера).

4.1. Стандарты синтаксиса Transact-SQL

Синтаксис Transact-SQL достаточно прост. Все языковые конструкции со­ стоят из одного или нескольких операторов или директив обработки данных. Все переменные и локальные объекты описываются до их использования.

Разделителем соседних операторов является специальный символ «;» - точка с запятой. Однако его использование опционально. Операторы, находя­ щиеся в разных строках SQL-кода, могут не разделяться точкой с запятой. Кро­ ме этого, недопустимо использование разделителей в некоторых операторах создания объектов БД (например, create view).

Работая в командной строке, пользователь имеет возможность выполнять достаточно сложные, структурированные последовательности действий. Одна­ ко они не фиксируются СУБД, и их повторный вызов становится проблемным. В подобных случаях рекомендуется отладить цепочку операторов и преобразо­ вать ее к какому-либо процедурному элементу. В этом случае повторный вызов будет осуществляться по имени процедуры.

Процедурный элемент SQL (наделен наименованием)

Шапка

Входные параметры

Выходные параметры

Тело

Объявление локальных переменных

 

Набор операторов

 

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

4.1.1. Работа с переменными

Возможности Transact-SQL значительно превосходят возможности клас­ сического SQL за счет использования переменных. Однако, как и во всех язы­ ках программирования, использованию переменной предшествует ее объявле­ ние. Объявление переменной реализуется директивой DECLARE следующего формата:

DECLARE @переменная тип

Занесение данных в переменную происходит с помощью директив SET или SELECT:

DECLARE @а integer SET @a=1Q0 SELECT @a=@a*2

Вывод значения переменной осуществляется директивами PRINT или SELECT:

DECLARE @s varchar(10) SET @8=’Привет!!!’ PRINT ‘Значение s=’+@s SELECT ‘ s=’+@s

Переменные существуют только в рамках кода, в котором они объявлены. После завершения работы процедурного элемента все переменные очищают­ ся, а их идентификаторы освобождаются.

4.1.2. Временные таблицы

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

В этом случае для хранения промежуточных расчетных данных сле­ дует использовать временные таблицы (они же буферы). Временные таб­ лицы характеризуются префиксом # перед именем ее идентификатора. Обычно в процедурах обработки данных используются локальные времен­ ные таблицы. В случае если данные промежуточных расчетов должны быть доступны другим пользователям, используйте глобальные временные таб­ лицы. Они начинаются с префикса ## (можно использовать и CREATE TA­ BLE).

select fio, passport into #temp_1 from t_worker select fio into #temp_2 from #temp_1

where fio like ‘%OB

update #temp_2 set fio=UPPER(fio) where fio in (‘Иванов’, ‘Петров’ select * from #temp_2

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

В командной строке SQL разработчику следует быть более осторожным, так как требуется программно уничтожать временные таблицы:

select fio into #temp_1 from t_worker select * from #temp_1

drop table #temp_1

К созданной другим пользователем глобальной временной таблице ##temp_global можно получить доступ обычным способом:

select * from ##temp_global

4.2. Основные управляющие конструкции Transact-SQL

Все запросы, которые мы рассмотрели, были прямолинейными, то есть просто последовательно выполняли определенные действия. Но логика не может быть всегда прямолинейной, она извилиста. Очень часто необходимо принимать решения на основе результатов, возвращаемых определенными за­ просами. Для управления логикой в языке Transact-SQL имеются следующие важнейшие конструкции:

-BEGIN...END - группировка команд (вложенность не ограничена), последовательность операторов, которые SQL Server трактует как одну

команду:

BEGIN

END

- IF ...ELSE - условный оператор:

IF (условие) BEGIN

END

ELSE

BEGIN

END

-CASE ...END - оператор множественного выбора (очень полезен для SELECT):

-PRINT CASE @var_exam

WHEN '5’ THEN ‘Отлично’

WHEN ‘ 4’ THEN ‘Хорошо’ ELSE ‘Плохо!!!’

END

- COALESCE - выбор первого ненулевого значения из аргументов:

PRINT COALESCE (10,NULL,’Привет!’)

W HILE (BREAK&CONTINUE) - поисковый цикл:

WHILE (@а<100) BEGIN

END

Рекомендуется отключать счетчик изменений:

SET NOCOUNTON BEGIN

END

SET NOCOUNT OFF

4.2.1. Синтаксис хранимых процедур

Хранимые процедуры представляют собой именованные группы команд, которые могут выполнять манипуляции с данными или вызывать другие ис­ полняемые конструкции. Хранимые процедуры компилируются сервером.

Расширенные хранимые процедуры, используемые системной БД Master, представляют собой DLL-библиотеки (разрабатываются на СВР и компилиру­ ются в соответствии со стандартом SQL Server Open Data Services API). Адми­ нистратор сервера может регистрировать эти библиотеки на сервере и разре­ шать пользователям их исполнение.

Создание процедуры выполняется оператором CREATE PROCEDURE:

CREATE PROCEDURE имя [вх_параметр тип = умолчание, ...n] AS [DECLARE

переменная тип, ...п] SET NOCOUNT ON BEGIN

END

SET NOCOUNT OFF

Модификация процедуры происходит директивой ALTER PROCEDURE

Удаление процедуры выполняется командой DROP PROCEDURE

Вызов хранимой процедуры EXECUTE: имя процедуры [параметры] EXECUTE имя_процедуры [параметры] Пример процедуры:

CREATE PROCEDURE р1 @Client_ld int AS SET NOCOUNT ON

begin select fio

from T_Client

where (id=@ClientJd) end

SET NOCOUNT Off Вызов процедуры: Р1 100

EXECUTE pi @Client_ld=100

4.2.2.Стандартные функции Transact-SQL

Вядре SQL Server имеется множество встроенных функций. Перечислим важнейшие группы функций:

Математические:

ABS(N) - модуль числа ISNUMERIC(N) - число ли это (1 или 0) SIGN(N) - знак числа (-1,1 или 0) RANDQ - случайное число (0...1) FLOOR(N) - округление вниз CEILING(N) - округление вверх

ROUND(N[,T]) - округление с точностью (+Т и -Т)

POWER(A,B) - А в степени В

SQUARE(N) - квадрат числа

SQRT(N) - корень из числа

PI0 - значение Пи

DEGREES(N) - Преобразование из радиан в градусы

RADLANS(N) - преобразование из градусов в радианы

SIN(N) - синус угла (в радианах)

COS(N) - косинус

TAN(N) - тангенс

COT(N) - котангенс

ASIN(N) - арксинус ACOS(N) - арккосинус ATAN(N) - арктангенс

EXP(N) - возвращает экспоненту

LOG(N) - натуральный логарифм

LOG10(N) - десятичный логарифм

Строковые:

ASCII(S) - ASCII-код левого символа строки UNICODE(S) - UNICODE-код левого символа строки CHAR(N) - обратно ASCII (символ по коду) NCHAR(N) - обратно UNICODE (символ по коду) LEN(S) - длина строки в символах (не в байтах) LTRIM(S) - удаляет пробелы слева

RTRIM(S) - удаляет пробелы справа LEFT(S,N) - вырезает N символов слева RIGHT(S,N) - вырезает N символов справа LOWER(S) - преобразует к нижнему регистру UPPER(S) - преобразует к верхнему регистру STR(F[,L[,T]]) - преобразует число к строке

SUBSTRINGS,К,N) - вырезает подстроку в строке SPACE(N) - возвращает строку из пробелов REPLICATE(S,N) - повторяет строку REPLACES,S1,S2) - заменяет все в S все S1 на S2 REVERSE(S) - строка из символов в обратном порядке SOUNDEX(S) - числовой код звучания строки (англ.)

DIFFERENCES 1,S2) - число ((М ) отличия созвучия строк (англ.)

Функции работы с датой:

GETDATE() - возвращает текущую дату и время

ISDATE(S) - проверяет дата ли строка S (1 или 0) DAY(D) - выделяет из даты число

MONTH(D) - выделяет из даты месяц YEAR(D) - выделяет из даты год

DATEADD(A,N,D) - добавляет диапазон времени к дате А:

год (уу или уууу), квартал (qq или q), месяц (mm или ш), день (dd или d), неделя (wk или ww), час (hh),

минута (mi или ш), секунда (ss или s), миллисекунда (ms) N: целое число

DATEDIFF(A,D1,D2)- отличие дат (в интервалах времени А) DATEPART(A,D) - выделяет нужную часть даты

Функции конфигурирования:

@@CONNECTIONS - число попыток подключения к серверу @@DATEFIRST - номер дня начала недели (0 или 1) @@LANGUAGE - текущий язык

@@MAX_CONNECTIONS —максимальное число подключений (до 32

767)

@@MAX_PRECISION - максимальная и минимальная точность (до 38 знаков)

@@NESTLEVEL - уровень вложенности процедур (от 0) @@SERVERNAME - имя SQL-сервера @@SERVICENAME - имя сервиса

@@VERSION - версия сервера

Системные функции:

APPNAM E - имя приложения (в котором выполняется команда) CURRENTUSER - имя текущего пользователя

@@ERROR - код последней ошибки

HOST_NAME - имя компьютера (на котором выполняется команда) IDENT_INCR(T) - величина инкремента счетчика (для Т) IDENT_SEED(T) - стартовая величина счетчика (для Т) @@IDENTITYпоследнее значение в счетчике

IS_NULL(V,Z) - возвращает Z, если V содержит NULL NEW IDQ - возвращает глобальный идентификатор NULLIF(V1,V2) - возвращает NULL если V1=V2 PARSENAME(S,N) - возвращает часть имени объекта

@@ROWCOUNT - хранит количество строк, обработанных командой SESSION U SER - имя пользователя (в текущем соединении) SYSTEM_USER - учетная запись пользователя или группы @@TRANCOUNT - число активных транзакций

USER - имя текущего пользователя

Статистика загрузки иработы сервера:

@@CPU_BUSY - время загрузки центрального процессора @@PACK_SENT - количество посланных пакетов @@PACK_RECEIVED - количество полученных пакетов @@PACKET_ERRORS - количество ошибочных пакетов @@TOTAL_ERRORS - общее количество ошибок

4.2.3. Функции пользователя

Если перечня стандартных функций Microsoft SQL Server недостаточно или какой-либо фрагмент вычисляемого кода очень часто повторяется, следу­ ет уметь создавать функции пользователя. Эта возможность появилась в SQL Server 2000. В предыдущих версиях в распоряжении разработчиков БД были

только стандартные функции Transact-SQL и возможность разработки пользо­ вательских хранимых процедур.

Функции пользователя разделяются на 3 группы:

-SCALAR-обычные функции;

-INLINE - содержат только одну команду-запрос;

-MULTI-STATEMENT - несколько команд возвращают набор данных. Их синтаксис весьма схож. Мы рассмотрим только наиболее распростра­

ненную в практике скалярную конструкцию:

 

CREATE FUNCTION имя [(вх_параметртип= умолчание,.. .п)]

RETURNS тип

 

 

AS

^

^

[DECLARE

переменная тип, ...п]

 

Внимательно изучите код

begin

 

функции и найдите ошибку!

 

 

Ч_____________________ _

RETURN значение end

Пример 1. функция возвращает максимальное из двух чисел:

CREATE FUNCTION GET.MAX (@N1 integer, @N2 integer) RETURNS integer

AS

DECLARE @temp_N integer begin

if @N1>N2 @temp_N=@N1 ELSE @temp_N=@N2 RETURNS @temp_N

end

Вызовы функции:

PRINT GET_MAX(10,17) SET @a=GET_MAX(@b,@c)

PRINT GET_MAX() - приведет к очевидному сбою!

Пример 2. Функция выдает максимальный оклад на указанном предприятии

CREATE FUNCTION GET_MAX_OKLAD (@Zavod varchar(20)=’BenTa’) RETURNS integer

AS

DECLARE @temp_oklad integer SET NOCOUNT ON

begin

select @temp_oklad = max(oklad) from T_Worker

where (zavod LIKE @Zavod)