Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.Б.Д / лекции / 12БД.doc
Скачиваний:
36
Добавлен:
30.05.2020
Размер:
115.71 Кб
Скачать

3 Функції Inline

Створення і зміна функції цього типу виконується за допомогою команди:

<визначення_табл_функції>::=

{CREATE | ALTER } FUNCTION [власник.]

ім’я_функції

( [ { @ім’я_параметра скаляр_тип_даних [=default]}[,...n]])

RETURNS TABLE

[ WITH {ENCRYPTION | SCHEMABINDING} [,...n] ]

[AS]

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

Основна частина параметрів, що використовуються при створенні табличних функцій, аналогічна параметрам скалярної функції. Проте створення табличних функцій має свою специфіку.

Після ключового слова RETURNS завжди повинне указуватися ключове слово TABLE. Таким чином, функція даного типу повинна строго повертати значення типу даних TABLE. Структура значення типу TABLE, що повертається, не указується явно при описі власне типу даних. Натомість сервер автоматично використовуватиме для значення, що повертається, TABLE структуру, що повертається запитом SELECT, який є єдиною командою функції.

Особливість функції даного типу полягає в тому, що структура значення TABLE створюється автоматично в ході виконання запиту, а не указується явно при визначенні типу після ключового слова RETURNS.

Значення типа TABLE, що повертається функцією, може бути використано безпосередньо в запиті, тобто в розділі FROM.

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

CREATE FUNCTION user1.itog()

RETURNS TABLE

AS

RETURN (SELECT TOP 2 Товар.Назва

FROM Товар INNER JOIN Склад ON Товар.КодТовара=Склад.КодТовара

ORDER Склад.Залишок DESC)

Приклад 12.2. Створення функції табличного типу для визначення двох найменувань товару з найбільшим залишком.

Використовувати функцію для отримання двох найменувань товару з найбільшим залишком можна таким чином:

SELECT Назва

FROM user1.itog()

4 Функції Multi-statement

Створення і зміна функцій типа Multi-statement виконується за допомогою наступної команди:

<визначення_мульти_функції>::=

{CREATE | ALTER }FUNCTION [власник.]

ім’я_функції ( [ { @ім’я_параметра скаляр_тип_даних [=default]}[,...n]])

RETURNS @ім’я_параметра TABLE <визначення_таблиці>

[WITH {ENCRYPTION | SCHEMABINDING} [,...n] ]

[AS]

BEGIN

<тіло_функції>

RETURN

END

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

Відзначимо, що функції даного типу, як і табличні, повертають значення типу TABLE. Проте, на відміну від табличних функцій, при створенні функцій Multi-statement необхідно явно задати структуру значення, що повертається. Вона указується безпосередньо після ключового слова TABLE і, таким чином, є частиною визначення типу даних, що повертається. Синтаксис конструкції <визначення_таблиці> повністю відповідає однойменним структурам, що використовуються при створенні звичайних таблиць за допомогою команди CREATE TABLE.

Набір даних, що повертаються, повинен формуватися за допомогою команд INSERT, виконуваних в тілі функції. Крім того, в тілі функції допускається використовування різних конструкцій язика SQL, які можуть контролювати значення, розміщувані у вихідному наборі рядків. При роботі з командою INSERT вимагається явно вказати ім'я того об'єкту, куди необхідно вставити рядки. Тому у функціях типа Multi-statement, на відміну від табличних, необхідно привласнити якесь ім'я об'єкту з типом даних TABLE – воно і указується як значення, що повертається.

Завершення роботи функції відбувається в двох випадках: якщо виникають помилки виконання і якщо з'являється ключове слово RETURN. На відміну від функцій скалярного типу, при використовуванні команди RETURN не потрібно указувати значення, що повертається. Сервер автоматично поверне набір даних типа TABLE, ім'я і структура якого була вказана після ключового слова RETURNS. В тілі функції може бути вказане більше однієї команди RETURN.

Необхідно відзначити, що робота функції завершується тільки за наявності команди RETURN. Це твердження вірне і у тому випадку, коли йдеться про досягнення кінця тіла функції – самою останньою командою винна бути команда RETURN.

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

Список співробітників з вказівкою кожного керівника представлений в таблиці emp_mgr з наступною структурою:

CREATE TABLE emp_mgr

(emp CHAR(2) PRIMARY KEY -- співробітник

mgr CHAR(2)) -- керівник

Приклад даних в таблиці emp_mgr показаний нижче. Для спрощення ілюстрації імена співробітників і їх начальників представлені буквами латинського алфавіту. У директора організації начальника немає (NULL).

emp mgr

а NULL

b а

с а

d а

e f

f b

g b

i с

к 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 @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 @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 @report SELECT empid, mgrid

FROM @t

RETURN

END

Приклад 11.3. Створення функції, яка для деякого співробітника виводить список всіх його підлеглих.

Застосуємо створену функцію для визначення списку підлеглих співробітника ‘b’:

SELECT * FROM fn_findReports('b')

Оператор повертає наступні значення:

emp mgr

b а

e f

f b

g b

Список підлеглих співробітника ‘a’ створюється за допомогою оператора

SELECT * FROM fn_findReports('a')

emp mgr

а NULL

b а

с а

d а

e f

f b

g b

i с

к d

Інший оператор формує список підлеглих співробітника ‘e’:

SELECT * FROM fn_findReports('e')

emp mgr

e f

Список підлеглих співробітника ‘c’ створює наступний оператор:

SELECT * FROM fn_findReports('c')

emp mgr

с а

i с

Видалення будь-якої функції здійснюється командою:

DROP FUNCTION {[ власник.] ім’я_функції } [,...n]

Соседние файлы в папке лекции