Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Voprosy_k_ekzamenu (1).doc
Скачиваний:
5
Добавлен:
28.09.2019
Размер:
275.97 Кб
Скачать

Хранимые процедуры

НЕДОСТАТКИ:

  • Отсутствие переносимости между платформами

  • Опасность фиксации неверного плана выполнения (смотри опцию WITH RECOMPLITE)

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

CREATE PROC[EDURE]<имя_процедуры>

[<имя_параметра><тип_данных>

[=<значение_по_умолчанию>][OUTPUT]

[,…]]

[WITH RECOMPLINE|ENCRYPTION|RECOMPLINE, ENCRYPTION]

[FOR REPLICATION]

AS <код>

Например

CREATE PROC spShippers

AS SELECT*FROM Shippers

GO

EXEC spShippers

Изменение хранимых процедур выполняется команда ALTER PROC, которая применяется для уже существующего объекта и оставляет неизменными все установленные для хранимых процедур права доступа.

Если применяется оператор DROP, а затем CREATE, то права доступа необходимо переустановить.

Удаление хранимых процедур == DROP PROC <имя_процедуры>

  • При выполнении директивы CREATE PROC осуществляет синтаксический анализ запросов.

  • После создания, процедура в результате первого вызова будет оптимизирована, скомпилирована и закэширована(помещена в кэш память) в системе.

  • При последующих запусках хранимых процедур на выполнение будет использоваться закэшированная версия (кроме случая, если используем опцию WITH RECOMPLITE). Это значит, что использование хранимых процедур не требует при выполнении времени на оптимизацию и компиляцию.

Ситуация когда происходит автоматическая перкомпиляция процедуры:

  • Процедуры всегда перекомпилируются при первом запуске, произошедшем с момента очередного запуска SQL.

  • План вполнения процедуры также автоматически перекомпилируется в случае удаления индекса таблицы, на которую есть ссылки в процедуре.

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

  • Автоматическая перекомпиляция в случае удаления и повторного создания хранимой процедуры.

  • Использование опции WITH RECOMPLITE.

Нельзя использовать опцию WITH RECOMPLITE в операторе FOR REPLICATION (опция используется для создания процедуры, которая выполняется во время репликации)

Чтобы зашифровать определение хранимых процедур, которые вносятся в системную таблицу syscomments, используют опцию ENCRIPTION с помощью запуска sp_helptext <имя_процедуры> или с помощью запроса:

Select c.id, c.text

FROM syscomments c INNER JOIN sysobjects o

ON c.id = o.id

WHERE o.name =’<имя_хранимой_процедуры>’

Объявление параметров хранимых процедур

Необходимо указать следующую информацию:

  • Имя

  • Тип данных

  • Значение по умолчанию

  • Направление (входной или выходной)

Синтаксис:

<имя_параметра> [AS]

<тип_данных>[=<умолчание>][OUTPUT]

  • Имя параметра должно начинаться с символа @, использование пробелов недопустимо

Оператор RETURN выполняет выход из процедуры:

RETURN [<целое_возвращаемое_значение>]

Для получения возвращаемого RETURN значения нужно определить некоторую переменную в операторе EXEC.

DECLARE @ReturnVal int

EXEC @ReturnVal=proc2

SELECT @ReturnVal

РЕКУРСИЯ

В программировании рекурсия — вызов функции (процедуры) из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложная или косвенная рекурсия), например, функция A вызывает функцию B, а функция B — функцию A. Количество вложенных вызовов функции или процедуры называется глубиной рекурсии.

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

Рекурсивны SQL запросы являются одним из способов решения проблемы дерева и других проблем, требующих рекурсивную обработку. Они были добавлены в стандарт SQL 99. До этого они уже существовали в Oracle. Несмотря на то, что стандарт вышел так давно, реализации запоздали. Например, в MS SQL они появились только в 2005-ом сервере.

Рекурсивные запросы используют довольно редко, прежде всего, из-за их сложного и непонятного синтаксиса:

with [recursive] <имя_алиаса_запроса> [ (<список столбцов>) ]

as (<запрос>)

<основной запрос>

В MS SQL нет ключевого слова recursive, а в остальном все тоже самое. Такой синтаксис поддерживается в DB2, Sybase iAnywhere, MS SQL и во всех базах данных, которые поддерживают стандарт SQL 99.

Проще разобрать на примере. Предположим, есть таблица:

create table tree_sample (

id integer not null primary key,

id_parent integer foreign key references tree_sample (id),

nm varchar(31) )

id – идентификатор

id_parent – ссылка на родитель

nm – название.

Для вывода дерева:

with recursive tree (nm, id, level, pathstr)

as (select nm, id, 0, cast('' as text)

from tree_sample

where id_parent is null

union all

select tree_sample.nm, tree_sample.id, t.level + 1, tree.pathstr + tree_sample.nm

from tree_sample

inner join tree on tree.id = tree_sample.id_parent)

select id, space( level ) + nm as nm

from tree

order by pathstr

Этот пример выведет дерево по таблице с отступами. Первый запрос из tree_sample этот запрос выдаст все корни дерева. Второй запрос соединяет между собой таблицу tree_sample и tree, которая определяется этим же запросом. Этот запрос дополняет таблицу узлами дерева.

Сначала выполняется первый запрос. Потом к его результатам добавляются результаты второго запроса, где данные таблица tree – это результат первого запроса. Затем снова выполняется второй запрос, но данные таблицы tree – это уже результат предыдущего выполнения второго запроса. И так далее. На самом деле база данных работает не совсем так, но результат будет таким же, как результат работы описанного алгоритма.

После этого данные этой таблицы можно использовать в основном запросе как обычно.

  1. Триггеры. Создание и виды триггеров. Логика СУБД при работе с триггерами. Области применение триггеров. Порядок запуска триггеров. Вложенные триггеры и рекурсивные триггеры.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]