Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_na_teoriyu_BD.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
4.06 Mб
Скачать
  1. Использование хранимых процедур и пользовательских функций

Ответ:

Хранимая процедура представляет собой набор заранее скомпилированных операторов 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.

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