- •Вопросы для подготовки к экзамену
- •1) Бд и файловые системы
- •2) Субд определение, функции
- •3) Субд определение, классификация
- •4) Бд основные определения, классификация
- •5) Объекты базы данных
- •Пользователи – лица, обладающие доступом к бд Роли позволяют объединять пользователей в группы
- •6) Физическая структура базы данных
- •7) Структурная часть реляционной модели
- •8) Фундаментальные свойства отношений
- •9) Реляционная алгебра Кодда
- •1. Оператор соединения
- •11) Этапы разработки бд
- •12) Нормальные формы отношений
- •13) Модель сущность-связь
- •14) Технология "клиент-сервер"
- •15) Обзор ms sql Server, клиентские приложения, системные таблицы
- •3. Утилиты командной строки
- •16) Основы языка sql, типы команд
- •17) Основной синтаксис оператора select
- •18) Построение нетривиальных запросов с использованием оператора select
- •19) Операторы dml
- •20) Операторы ddl
- •21) Операторы ddl (определение структуры таблицы)
- •22) Индексы в среде ms sql Server
- •23) Представления
- •24) Сценарии
- •25) Хранимые процедуры
- •26) Понятие функции
- •27) Триггеры
- •28) Курсоры
26) Понятие функции
При реализации на языке SQL сложных алгоритмов, которые могут потребоваться более одного раза, сразу встает вопрос о сохранении разработанного кода для дальнейшего применения.
Эту задачу можно было бы реализовать с помощью хранимых процедур, однако их архитектура не позволяет использовать процедуры непосредственно в выражениях, т.к. они требуют промежуточного присвоения возвращенного значения переменной, которая затем и указывается в выражении.
Пользовательские функции сходны с хранимыми процедурами, но, в отличие от них, могут применяться в запросах так же, как и системные встроенные функции.
Классы функции
Scalar – функции возвращают обычное скалярное значение, каждая может включать множество команд, объединяемых в один блок с помощью конструкции BEGIN...END;
Inline – функции содержат всего одну команду SELECT и возвращают пользователю набор данных в виде значения типа данных TABLE;
Multi-statement – функции также возвращают пользователю значение типа данных TABLE, содержащее набор данных, однако в теле функции находится множество команд SQL (INSERT, UPDATE и т.д.). Именно с их помощью и формируется набор данных, который должен быть возвращен после выполнения функции.
Функции Scalar
{CREATE | ALTER } FUNCTION [владелец.] имя_функции
( [ { @имя_параметра скаляр_тип_данных [=default]}[,...n]])
RETURNS скаляр_тип_данных
[WITH ENCRIPTION ]
[AS]
BEGIN<тело_функции>
RETURN скаляр_выражение
END
Пример
CREATE FUNCTION dbo.KolData
(@data DATETIME)
RETURNS INT
AS
BEGIN
DECLARE @c INT
SET @c=(SELECT SUM(Quantity*Price) FROM Orders O INNER JOIN [Order Details] OD ON O.OrderID=OD.OrderID WHERE OrderDate=@data)
RETURN (@c)
END
DECLARE @kol INT
SET @kol= dbo.KolData ('02.11.01')
SELECT @kol
SELECT DISTINCT OrderDate, dbo.KolData(OrderDate) FROM Orders
Функции Inline
{CREATE | ALTER } FUNCTION [владелец.] имя_функции
( [ { @имя_параметра скаляр_тип_данных [=default]}[,...n]])
RETURNS TABLE [ WITH ENCRIPTION]
[AS]
RETURN [(] SELECT_оператор [)]
Особенность функции данного типа заключается в том, что структура значения TABLE создается автоматически в ходе выполнения запроса, а не указывается явно при определении типа после ключевого слова RETURNS.
Возвращаемое функцией значение типа TABLE может быть использовано непосредственно в запросе, т.е. в разделе FROM.
Функции Multi-statement
{CREATE | ALTER }FUNCTION [владелец.] имя_функции
( [ { @имя_параметра скаляр_тип_данных [=default]}[,...n]])
RETURNS @имя_параметра TABLE <определение_таблицы>
[WITH ENCRIPTION]
[AS]
BEGIN
<тело_функции>
RETURN END
В отличие от табличных функций, при создании функций Multi-statement необходимо явно задать структуру возвращаемого значения. Она указывается непосредственно после ключевого слова TABLE и, таким образом, является частью определения возвращаемого типа данных. Синтаксис конструкции <определение_таблицы> полностью соответствует одноименным структурам, используемым при создании обычных таблиц с помощью команды CREATE TABLE.
Набор возвращаемых данных должен формироваться с помощью команд INSERT, выполняемых в теле функции. Кроме того, в теле функции допускается использование различных конструкций языка SQL, которые могут контролировать значения, размещаемые в выходном наборе строк.
При работе с командой INSERT требуется явно указать имя того объекта, куда необходимо вставить строки. Поэтому в функциях типа Multi-statement, в отличие от табличных, необходимо присвоить какое-то имя объекту с типом данных TABLE – оно и указывается как возвращаемое значение.