- •Базы данных
- •Бд основные понятия и определения
- •Классификация моделей бд
- •Основные понятия иерархической модели данных
- •Основные понятия сетевой модели данных
- •Основные понятия реляционных моделей данных
- •Сортировка, поиск и замена данных в таблицах
- •Индексирование данных в реляционных таблицах
- •Концептуальная модель данных, основные понятия и определения
- •Язык sql, стандарты, основные операторы sqLзапроса
- •Типы данных sql
- •Операторы создания базы данных на языке sql
- •Запросы, назначения запросов, виды запросов
- •Использование агрегированных функций запросов
- •Использование вложенных запросов
- •Операторы соединения на языке sql
- •Типы отношений в концептуальной модели данных
- •Теоретико-множественные операции реляционной алгебры (с примерами)
- •Специальные операции реляционной алгебры (с примерами)
- •Использование хранимых процедур и пользовательских функций
- •Понятие и применение триггеров
Использование хранимых процедур и пользовательских функций
Ответ:
Хранимая процедура представляет собой набор заранее скомпилированных операторов SQL и операторов управления программой. Хранимые процедуры расширяют стандартные возможности SQL, позволяя использовать параметры, операторы принятия решения и объявления переменных, а также возвращать информацию.
Хранимую процедуру можно представить себе в виде программы или функции, которая хранится в SQL Server как объект базы данных. Хранимая процедура выполняется не по инициативе клиента, а по инициативе SQL Server. Хранимая процедура может иметь вид простейшего оператора SQL, например: SELECT * FROM authors
Хранимая процедура может также включать ряд сложных операторов SQL и операторов управления программой, которые позволяют применить к таблицам базы данных сложную логику приложения или выполнить некоторую задачу.
С помощью хранимых процедур можно осуществить сложные операции, которые нельзя выполнить с использованием обычных операторов SQL.
По сравнению со стандартными операторами SQL хранимые процедуры обеспечивают значительный выигрыш в быстродействии, поскольку операторы SQL, содержащиеся в хранимой процедуре, заранее скомпилированы. После первого выполнения хранимой процедуры создается план ее выполнения, который сохраняется в процедурном кэше, и поэтому все последующие выполнения хранимой процедуры протекают намного быстрее по сравнению с эквивалентными операторами SQL.
Хранимые процедуры можно использовать в качестве механизма защиты. Например, если есть много таблиц или представлений, к которым не нужно предоставлять прямой доступ со стороны пользователей, можно отменить всеобщий доступ к базовым таблицам и создать хранимые процедуры, предоставляя пользователям только права на выполнение соответствующих хранимых процедур. После этого пользователи смогут получать доступ к таблицам только путем выполнения хранимых процедур.
Использование хранимых процедур в качестве механизма защиты – это единственный способ не допустить случайной модификации таблицы со стороны пользователей, "вооруженных" такими специальными инструментами, как MS-Query и Microsoft Access. Предоставьте пользователям доступ к таблицам только по чтению, а затем для выполнения таких модификаций, как update и delete, создайте хранимые процедуры.
Максимальная длина имен и идентификаторов составляет 30 символов. Хранимая процедура может иметь до 255 параметров. Максимальный размер хранимой процедуры 65 025 байт. SQL Server поддерживает до 16-ти уровней вложений хранимых процедур. Для того чтобы модифицировать хранимую процедуру ее нужно сначала удалить, а затем создать заново и снова назначить соответствующие права доступа к ней.
Но с помощью хранимых процедур трудно реализовать сложную логику приложения. Проблема состоит в том, что в языке Transact-SQL не предусмотрены такие сложные конструкции программирования, как массивы и возможность создания функций, определенных пользователем. Кроме того, редактор хранимых процедур не такой высокоорганизованный и многофункциональный, как редактор программного кода в Visual Basic. Он больше напоминает текстовый редактор Notepad (Блокнот), а при возникновении синтаксических ошибок весьма трудно расшифровать, на что "намекают" сообщения об ошибках.
Могут возникнуть трудности при эксплуатации хранимых процедур. Если область их приложения связана с проектами разработки или специальными административными задачами, количество хранимых процедур может быть очень высоким. В этом случае проблематично запомнить, что делает каждая процедура и в каких процедурах используются другие хранимые процедуры. В SQL Server не предусмотрено никаких административных средств для упрощения этой задачи, и поэтому поддержка хранимых процедур потребует от вас дополнительных усилий.
Создание хранимой процедуры
Для создания хранимой процедуры в среде SQL Server используется оператор CREATE PROCEDURE, синтаксис которого имеет следующий вид:
В приведенном выше синтаксисе оператора создания хранимой процедуры вместо элемента имя процедуры нужно указать имя хранимой процедуры.
Кроме того, в приведенном выше синтаксисе элемент номер означает необязательное целое число, которое можно использовать для группировки хранимых процедур под одним именем, чтобы их можно было удалить с помощью одного оператора. Нетрудно догадаться, что синтаксическая единица параметр означает возможность передачи в хранимую процедуру необязательных параметров. При использовании опции WITH RECOMPILE план запроса хранимой процедуры не хранится в процедурном кэше. Вместо этого при каждом выполнении процедуры генерируется новый план запроса. Опции FOR REPLICATION и WITH RECOMPILE совместно использовать нельзя.
При использовании опции WITH RECOMPILE теряется преимущество плана скомпилированного запроса. Однако скомпилированная процедура выполняется все же быстрее обычного запроса, поскольку текст SQL уже проанализирован и дерево запроса построено. Но более важно то, что в случае применения опции WITH RECOMPILE вы теряете меньше времени (которое уходит на создание плана запроса), чем при использовании некорректного плана запроса, на обработку которого могут уйти минуты или даже часы.
Под элементом Оператора SQL понимаются операторы SQL или операторы управления программой, составляющие хранимую процедуру.
Пример 1. Создание хранимой процедуры с именем usp_show_authors, которая выбирает все столбцы и строки из таблицы authors.
CREATE PROCEDURE usp show authors
AS
SELECT * FROM authors
Хранимые процедуры создаются в той базе данных, в которой была выполнена команда CREATE PROCEDURE. Исключением являются временные хранимые процедуры, которые создаются в базе данных tempdb.
Для запуска хранимой процедуры наберите ее имя в окне запросов программы Microsoft SQL Server Query Analyzer и щелкните на зеленой стрелке. Если же хранимая процедура не является первым оператором в строке запроса, для ее запуска используйте оператор EXECUTE.
Пример 2. Выполнение хранимой процедуры
EXECUTE usp show authors
А вот сокращенный формат, который, как правило, и используется:
ЕХЕС usp show authors
Операторы управления
GОТО метка
BEGIN...END
IF...ELSE
WAITFOR
RETURN
WHILE
BREAK
CONTINUE
Оператор DECLARE
Оператор PRINT
RAISERROR
Оператор DECLARE
С помощью оператора DECLARE можно создавать переменные, используя стандартные типы данных SQL Server. Переменные, определяемые оператором DECLARE, должны начинаться с символа @. В одном операторе DECLARE можно объявить сразу несколько переменных, разделяя их запятыми. Синтаксис оператора DECLARE имеет следующий вид:
DECLARE @переменная 1 тип данных
[,@переменная 2 тип данных...]
Пример 3. Создание трех переменных различных типов данных.
DECLARE @count INT, @current date DATETIME
DECLARE @My_Hessage VARCHAR(255)
Чтобы инициализировать или установить значение переменной, создаваемой с помощью оператора DECLARE, используйте ключевое слово SELECT.
Пример 4. Устанавливание значения переменной @count равного 100
Select @count = 100
Пример 5. Устанавливание значения переменной @count равного общему числу строк в таблице authors, принадлежащей базе данных pubs
SELECT @count = count(*) FROM pubs.authors
Оператор GOTO
Оператор GOTO выполняет ту же самую функцию, что и во многих других языках программирования, таких как С и Visual Basic. Он передает управление соответствующей метке хранимой процедуры, с которой и будет продолжено выполнение операторов.
Оператор GOTO имеет следующий синтаксис:
GOTO метка
Пример 6. Оператор GOTO пропускает оператор SELECT и выполняет оператор UPDATE:
GOTO do_update SELECT * from authors
do_update:
UPDATE authors
SET au_Iname = "Spenik"
WHERE state = 'VA'
При определении метки помните, что ее имя должно оканчиваться двоеточием. А при ссылке на метку через GOTO двоеточие опускается.
Оператор BEGIN.. .END
Операторы BEGIN и END считаются блочными, поскольку они объединяют набор операторов SQL и операторов языка управления программой в единое целое. Операторы BEGIN и END часто используются с блоками IF...ELSE.
Синтаксис операторов BEGIN и END имеет следующий вид:
BEGIN
{Операторы SQL | блок операторов}
END
Оператор IF.. .ELSE
С помощью операторов IF...ELSE можно проверять условия и в зависимости от результатов проверки выполнять соответствующие операторы SQL. Оператор IF проверяет выражение типа BOOLEAN, которое возвращает значение TRUE (ИСТИНА) или FALSE (ЛОЖЬ). Если возвращаемое значение равно TRUE, выполняется блок операторов или единственный оператор, который следует сразу за оператором IF. Если же возвращаемое значение равно FALSE, выполняется необязательный оператор ELSE.
Синтаксис оператора IF.. .ELSE выглядит следующим образом:
IF Выражение типа BOOLEAN
{Операторы SQL | блок операторов}
(ELSE [ Выражение_ типа_ВООLEAN
{Операторы SQL | блок операторов}]
Пример 7. Использование операторов IF и IF.. .ELSE как одиночным оператором SQL, так и с блоком операторов.
IF ecount = 0
SELECT * FROM authors
ELSE
SELECT * FROM titles
IF @Total != 0
BEGIN
SELECT count(*) FROM authors
SELECT count(*) FROM titles
END
ELSE
BEGIN
SELECT * FROM authors
SELECT * FROM titles
END
Оператор WAITFOR
Оператор WAITFOR формирует задержку, в течение которой хранимая процедура находится в состоянии ожидания. Величина задержки определяется либо заданным интервалом времени (с помощью опции DELAY), либо интервалом до наступления заданного времени суток (с помощью опции TIME). По истечении времени задержки выполнение хранимой процедуры продолжается.
Синтаксис оператора WAITFOR имеет следующий вид:
WAITFOR {DELAY 'интервал времени' | TIME 'время суток'}
Максимальное время задержки, формируемое оператором WAITFOR, составляет 24 часа. В опциях TIME и DELAY используется формат чч:мм:сс.
Пример 8. формирование 10-секундной задержки.
WAITFOR DELAY '00:00:10'
Пример 9. формирование состояния ожидания до 11 часов утра.
WAITFOR TIME '11:00:00'
Оператор RETURN
Оператор RETURN выполняет выход из хранимой процедуры и обеспечивает возврат в вызывающую процедуру или приложение. Синтаксис оператора RETURN выглядит следующим образом:
RETURN [Целое значение]
Целое значение можно вернуть в вызывающую процедуру или приложение, используя следующий синтаксис:
exec @status = имя_процедуря
Пример 10. Представление хранимой процедуры usp return, которая возвращает целое значение в вызывающую процедуру или приложение и хранимой процедуры usp_call, которая вызывает хранимую процедуру usp return и проверяет возвращаемое значение.
CREATE PROCEDURE usp_return
AS
DECLARE @gret_val INT
SELECT @gret_val = 0
RETURN @gret_val
go
CREATE PROCEDURE usp_call
AS
DECLARE @Status INT
EXEC @Status = usp_return if(@Status = 0)
PRINT "Возвращаемое значение равно нулю"
go
При написании хранимых процедур в среде SQL Server нулевое значение (0) используется для индикации факта успешного завершения. Отрицательные значения свидетельствуют о возникновении ошибки. Коды возврата, находящиеся в диапазоне от -1 до -99, зарезервированы для SQL Server.
С помощью оператора RETURN можно возвращать только целые значения. Если же нужно возвращать данные других типов, необходимо использовать параметры хранимой процедуры.
Операторы WHILE, BREAK и CONTINUE
С помощью оператора WHILE можно циклически выполнять один оператор SQL или блок операторов до тех пор, пока соблюдается заданное условие.
Оператор BREAK вызывает выход из цикла WHILE, а оператор CONTINUE — безусловный переход к началу цикла, пропуская все операторы, стоящие за оператором CONTINUE.
Эти операторы имеют следующий формат:
WHILE Выражение типа BOOLEAN [оператор SQL | блок операторов} [BREAK | CONTINUE]
Оператор PRINT
С помощью оператора PRINT можно возвратить сообщение в обработчик сообщений клиента. Сообщение может иметь длину до 1 024 символов. Оператор PRINT имеет следующий синтаксис:
PRINT 'любой ASCII-текст' | локальная переменная | @@FUNCTION | строковое выражение
Пример 11. Вывод на печать значение локальной или глобальной переменной, преобразованной сначала в тип CHAR или VARCHAR.
DECLARE @msg VARCHAR(255), @count INT
SELECT @count = 0
PRINT "Начало процедуры"
WHILE fcount < 5
BEGIN
SELECT @count = gcount + 1
SELECT @msg = "Значение переменной @count равно " + STR(@count)
PRINT @msg
END
SELECT @msg = "Процедура подходит к концу. "
SELECT @msg = @msg + "Значение переменной @count равно " + STR(@count)
PRINT @msg
GO
Используйте операторы PRINT в своих хранимых процедурах во время тестирования, чтобы упростить процесс отладки. Используйте оператор PRINT в качестве оператора трассировки для вывода признаков прохождения отдельных точек программы или значений переменных.
Оператор RAISERROR
Оператор RAISERROR устанавливает системный признак SQL Server, чтобы обозначить факт возникновения ошибки, и посылает сообщение об ошибке клиенту. Синтаксис оператора RAISERROR имеет следующий вид:
RAISERROR ({Номер_ сообщения | Строка_сообщения}, серьезность, состояние [ ,аргуыент1[ ,аргумент 2]]) [WITH (LOG | NOWAIT | SETERROR)]
Опцию WITH LOG используйте для записи сообщения об ошибке в журнал ошибок SQL Server и журнал приложений Windows NT.
Комментарии
Комментарии в хранимой процедуре соответствуют стандарту языка программирования С или стилю ANSI.
Комментарии начинаются с сочетания символов /* и заканчиваются теми же символами, но в обратном порядке: */.
Все, что находится между парами символов /* и */, относится к комментариям. Комментарии, которые начинаются с символов –, соответствуют стандарту ANSI.
Пример 12. Примеры комментариев.
/* Это одна строка комментария */
/* Этот
комментарий
занимает
несколько строк */
/*
** Это тоже комментарий; я думаю, что звездочки
** облегчают его чтение.
*/
*Это комментарий в стиле ANSI.
