Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методические указания к лабораторным работам.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.29 Mб
Скачать

Оформление отчета

  1. Титульный лист оформляется согласно традиционным требованиям, включая Номер работы, Номер группы и ФИО студента, а также кто принимал данную работу.

  2. Содержание должно включать Тему лабораторной работы и Ход ее выполнения.

  3. Ход выполнения работы должен содержать все инструкции SQL реализованные в лабораторной работе. Условия заданий записывать не обязательно.

  4. Записать текст реализации представления, включая оператор CREATE VIEW. Условия задания записывать не обязательно.

  5. Вывод.

Контрольные вопросы

  1. Структура СУБД.

  2. Функции ядра СУБД.

  3. В чем состоит отличие запросов на выборку от представлений?

  4. Виды представлений.

  5. Основные условия для построения модифицируемых представлений.

  6. Понятие триггера.

  7. Задачи, решаемые с помощью триггеров.

  8. Недостатки использования триггеров.

  9. Типы триггеров.

Использование таблиц inserted и deleted.

Лабораторная работа № 2. Создания хранимых процедур и функций с использованием средства субд sql Server и языковых конструкций Transact-sql.

Цель работы

Изучение возможностей программирования элементов поддержки БД под управлением СУБД SQL Server.

Задание на лабораторную работу

  1. Ознакомиться с методическими указаниями по выполнению лабораторной работы.

    1. Создание и модификация хранимой процедуры.

    2. Создание и модификация функции пользователя.

  2. Выполнить задания для самостоятельной работы.

    1. Создать процедуры в соответствии с заданием.

    2. Создать функции в соответствии с заданием.

  3. Оформить отчет о выполнении лабораторной работе.

Методические рекомендации по выполнению работы

(1)

Создание и модификация хранимой процедуры

Выберите в дереве Проводника пункт Stored Procedures и, активизируя всплывающее меню, дайте команду New Stored Procedure. В появившемся окне Stored Procedure Properties в рабочую область выводится шаблон текста процедуры:

CREATE PROCEDURE [имя процедуры] [Описание входных переменных]

[Описание локальных переменных]

AS

Задайте имя процедуры и введите текст запроса (после ключевого слова AS).

Пример создания хранимой процедуры.

Создать процедуру для обновления таблицы ИЗДЕЛИЕ, имеющую два параметра: наименование и цена изделия. Первый параметр должен использоваться для идентификации редактируемой строки таблицы, второй – для занесения значения в соответствующее поле.

/*Задаем имя процедуры и параметр – в виде переменной и ее типа:*/

CREATE PROCEDURE update_izdelie @name1 CHAR(20), @name2 int

AS

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

UPDATE IZDELIE

SET [CENA] = @name2

WHERE [NAIMENOVANIE] = @name1

По окончании ввода текста проверьте синтаксис и сохраните процедуру (аналогичные действия описаны выше в п. «Создание и модификация триггера»). Имя процедуры появится в списке процедур в правой рабочей панели основного окна ЕМ.

Для модификации процедуры выберите ее из списка в правой панели ЕМ и инициируйте команду всплывающего меню Properties. Появится окно Stored Procedure Properties.

Вызов процедуры

Хранимую процедуру можно вызвать на выполнение из окна Query утилиты QA. Синтаксис команды вызова:

EXEC имя–процедуры список–значений– параметров

(2)

Создание и модификация пользовательской функции

Выберите в дереве Проводника пункт User Defined Function и, активизируя всплывающее меню, дайте команду New User Defined Function. В появившемся окне User Defined Function Properties в рабочую область выводится шаблон текста функции.

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

В SQL Server имеются следующие классы функций пользователя:

  • Scalar – функции возвращают обычное скалярное значение, каждая может включать множество команд, объединяемых в один блок с помощью конструкции BEGIN...END;

  • Inline – функции содержат всего одну команду SELECT и возвращают пользователю набор данных в виде значения типа данных TABLE;

  • Multi-statement – функции также возвращают пользователю значение типа данных TABLE, содержащее набор данных, однако в теле функции находится множество команд SQL (INSERT, UPDATE и т.д.). С их помощью и формируется набор данных, который должен быть возвращен после выполнения функции.

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

Функции Scalar

Создание и изменение функции данного типа выполняется с помощью команды:

{CREATE | ALTER } FUNCTION [владелец.]имя_функции

( [ { @имя_параметра скаляр_тип_данных

[=default]}])

RETURNS скаляр_тип_данных

[WITH {ENCRYPTION | SCHEMABINDING}]

AS

BEGIN

<тело_функции>

RETURN скаляр_выражение

END

Дополнительные параметры, с которыми может быть создана функция, указываются посредством ключевого слова WITH. С помощью ключевое слово ENCRYPTION код команды, используемый для создания функции, будет зашифрован.

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

Когда в ходе выполнения кода функции встречается ключевое слово RETURN, выполнение функции завершается и как результат ее вычисления возвращается значение, указанное непосредственно после слова RETURN. В теле функции разрешается использование множества команд RETURN, которые могут возвращать различные значения. Единственное условие – тип данных возвращаемого значения должен совпадать с типом данных, указанным после ключевого слова RETURNS.

Например. Создать функцию скалярного типа для вычисления суммарного количества поставляемого товара, поступившего за определенную дату (2005 год). Владелец функции – пользователь с именем dbo.

CREATE FUNCTION

dbo.summ(@data DATETIME)

RETURNS int

AS

BEGIN

DECLARE @c int

SELECT @c = SUM(Количество)

FROM Поставка a INNER JOIN Заказ b ON a.Номер_заказа = b.Номер_заказа

WHERE дата_заказа = @data

RETURN (@c)

END

Вызов функции можно осуществить следующим образом

DECLARE @kol int

SET @kol=dbo.samm ('02.11.05')

/*просмотр результата*/

SELECT @kol

Функции Inline

Создание и изменение функции этого типа выполняется с помощью команды:

{CREATE | ALTER } FUNCTION [владелец.]имя_функции

( [ { @имя_параметра скаляр_тип_данных

[=default]})

RETURNS TABLE

[ WITH {ENCRYPTION | SCHEMABINDING}

AS

RETURN [(] SELECT_оператор [)]

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

После ключевого слова RETURNS всегда должно указываться ключевое слово TABLE. Структура возвращаемого значения типа TABLE не указывается явно при описании собственно типа данных. Вместо этого сервер будет автоматически использовать для возвращаемого значения TABLE структуру, возвращаемую запросом SELECT, который является единственной командой функции.

Возвращаемое функцией значение типа TABLE может быть использовано непосредственно в запросе, т.е. в разделе FROM.

Например. Создать функцию табличного типа для определения двух наименований товара с наибольшим количеством поставок.

CREATE FUNCTION dbo.itog()

RETURNS TABLE

AS

RETURN (SELECT TOP 2 Наименование

FROM Изделие a INNER JOIN Поставка b

ON а.Код_модели=b.Код_модели

ORDER BY Количество DESC)

Вызов функции можно осуществить следующим образом

SELECT Наименование FROM dbo.itog()

Функции Multi-statement

Создание и изменение функций типа Multi-statement выполняется с помощью следующей команды:

{CREATE | ALTER }FUNCTION [владелец.]имя_функции

( [ { @имя_параметра скаляр_тип_данных

[=default]}])

RETURNS @имя_параметра TABLE

<определение_таблицы>

[WITH {ENCRYPTION | SCHEMABINDING}

AS

BEGIN

<тело_функции>

RETURN

END

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

Набор возвращаемых данных должен формироваться с помощью команд INSERT, выполняемых в теле функции. Кроме того, в теле функции допускается использование различных конструкций языка SQL, которые могут контролировать значения, размещаемые в выходном наборе строк. При работе с командой INSERT требуется явно указать имя того объекта, куда необходимо вставить строки (переменная типа TABLE).

В отличие от функций скалярного типа, при использовании команды RETURN не нужно указывать возвращаемое значение. Сервер автоматически возвратит набор данных типа TABLE, имя и структура которого была указана после ключевого слова RETURNS.

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

Список сотрудников с указанием каждого руководителя представлен в таблице emp_mgr со следующей структурой (у директора организации начальника нет – null):

emp

(сотрудник)

mgr

(руководитель)

a

null

b

a

c

a

d

a

e

f

f

b

g

b

i

c

k

d

CREATE FUNCTION fn_findReports(@id_emp CHAR(2))

RETURNS @report TABLE(empid CHAR(2) PRIMARY KEY, mgrid CHAR(2))

AS

BEGIN

DECLARE @r INT

DECLARE @t TABLE(empid CHAR(2) PRIMARY KEY, mgrid CHAR(2),

pr INT DEFAULT 0)

INSERT INTO @t SELECT emp,mgr,0 FROM emp_mgr WHERE emp=@id_emp

SET @r=@@ROWCOUNT /*функция возвращает количество строк*/

WHILE @r>0

BEGIN

UPDATE @t SET pr=1 WHERE pr=0

INSERT INTO @t SELECT e.emp, e.mgr,0 FROM emp_mgr e, @t t

WHERE e.mgr=t.empid AND t.pr=1

SET @r=@@ROWCOUNT /*функция возвращает количество строк*/

UPDATE @t SET pr=2 WHERE pr=1

END

INSERT INTO @report SELECT empid, mgrid FROM @t

RETURN

END

Определим список подчиненных сотрудника ‘b’:

SELECT * FROM fn_findReports('b')

Оператор возвратит следующие значения:

emp

mgr

b

a

e

f

f

b

g

b