
- •1. Конспект лекций (семестр 5)
- •1.1. Введение в базы данных
- •1.2. Классификация моделей данных
- •1.3. Язык sql
- •1.4. Проектирование баз данных
- •1.5.Физические модели баз данных
- •1.6. Распределённая обработка данных
- •1.7. Обеспечение безопасности в бд
- •1.8. Современные направления исследований и разработок
- •1.9. Методы и модели анализа данных: olap и Data Mining
- •2. Конспект лекций (семестр 6)
- •2.1. Представления
- •2.2. Компоненты языка Transact-sql
- •2.3. Курсоры
- •2.4. Хранимые процедуры
- •2.5. Триггеры
- •3. Рекомендуемая литература
2.4. Хранимые процедуры
До сих пор мы рассматривали пакеты операторов Transact SQL, хранимые в текстовом файле. SQL Server позволяет создавать хранимые процедуры, представляемые также пакеты операторов Transact SQL, хранимые на сервере.
Хранимые процедуры обладают рядом преимуществ:
хранимые процедуры являются объектами базы данных; они размещаются в файле базы данных и перемещаются вместе с файлом в случае отключения или репликации базы данных;
хранимые процедуры позволяют передавать данные процедуре для их обработки и принимать обратно от процедуры как данные, так и сформированный процедурой итоговый код;
хранимые процедуры представляются в оптимизированной форме, что дает возможность ускорить их выполнение.
SQL-сценарии, с которыми мы работали, выполнялись независимо - у нас не было никакой возможности передать им какую-либо информацию, а единственная информация, которую они возвращали, отображалась в панелях сетки Grid или в панели сообщений Message Pane окна Query (Запрос). Хранимые процедуры предоставляют два метода взаимодействия с внешними процессами: через параметры и через возвращаемые значения.
Параметры представляют собой специальный тип локальных переменных, объявляемых как часть хранимой процедуры. Вы можете использовать параметры для передачи информации хранимым процедурам (входные параметры) или получения данных обратно из хранимой процедуры (выходные параметры).
Возвращаемые значения всегда являются целыми числами. Теоретически они могут быть использованы для возврата любого результата, но в соответствии с соглашением они применяются для возврата статуса выполнения хранимой процедуры.
Например, хранимая процедура может возвращать 0, если все идет нормально, или -1, если возникла ошибка. Более сложные хранимые процедуры могут возвращать различные значения для указания типа ошибки.
Важно не путать параметры и возвращаемые коды с какими-либо результирующими множествами, которые может возвращать хранимая процедура. Хранимая процедура может содержать любое количество операторов SELECT, которые будут возвращать результирующие множества. Для их получения вам не нужно использовать параметр; они будут возвращены в программу приложения независимо.
Хранимые процедуры делятся на две группы: системные процедуры, создаваемые SQL Server, и пользовательские процедуры, которые вы создаете самостоятельно. Системные хранимые процедуры хранятся в главной базе данных. Все они начинаются с символов sp_.
В главной базе данных около сотни системных процедур. Многие из них предоставляют средства для программного выполнения задач администрирования.
Использование и создание хранимых процедур
Как и для всех других объектов базы данных, сначала нужно создать пользовательскую хранимую процедуру, затем её можно использовать.
Для вызова пользовательских и системных хранимых процедур используется оператор EXECUTE:
EXECUTE имя_процедуры параметр [, параметр]
Использование Object Browser для работы с хранимыми процедурами
Панель Object Browser содержит папку Stored Procedures для каждой базы данных, включая главную. Каждая хранимая процедура, содержащаяся в списке, имеет папку Parameters. В этой папке в определенном порядке размещаются параметры хранимой процедуры, поэтому вы можете воспользоваться ею для проверки имен параметров и их позиций.
Создание хранимой процедуры
CREATE PROCEDURE имя_процедуры
[список параметров]
AS
операторы_процедуры
Имя_процедуры должно отвечать правилам, принятым для идентификаторов.
Вы можете создать временную локальную или глобальную хранимую процедуру, указав перед именем процедуры # или ## соответственно.
Операторы_процедуры, следующие после ключевого слова AS в операторе CREATE, определяют действия, которые будут выполняться при вызове хранимой процедуры. Хранимые процедуры могут вызвать другие хранимые процедуры, т. е. реализовывать вложенность. Фактическая глубина вложенности хранимых процедур составляет 32.
Имена_параметров должны начинаться с символа @, подобно локальным переменным.
@имя_параметра тип_данных [= значение_по_умолчанию] [OUTPUT]
Параметры являются локальными переменными; они видимы только в пределах хранимой процедуры.
Значение_по_умолчанию представляет собой значение, которое будет использоваться хранимой процедурой в случае, если пользователь не укажет значение для входного параметра в вызове хранимой процедуры. Ключевое слово OUTPUT, которое также не является обязательным, определяет параметры, которые будут возвращены в вызвавший процедуру сценарий.
Использование аргументов
Хранимые процедуры не были бы так полезны, если бы они не могли принимать аргументы. В этом хранимые процедуры подобны функциям: они принимают один или более аргументов и возвращают вызывающему коду одно или более значений. Кроме того, хранимые процедуры могут возвращать один или более курсоров. Курсор — это эквивалент объекта ADO Recordset (но не совсем то же самое, что объект DataSet из ADO .NET). Данные курсора выводятся на панели Results в окне Query Analyzer, когда вы выполняете инструкцию SELECT.
Аргументы, передаваемые в хранимую процедуру и из нее, объявляются после имени процедуры в инструкции CREATE PROCEDURE. Список разделенных запятыми аргументов следует после имени процедуры, перед ключевым словом AS:
CREATE PROCEDURE procedure_name
@argument1 type1, @argument2 type2, …
AS
Возврат значений из хранимой процедуры
Возврат значений реализуется с помощью оператора RETURN, который имеет следующую форму: RETURN (int)
В операторе RETURN int - это целочисленное значение. Возврат значений чаще всего используется для определения статуса выполнения хранимой процедуры. Ошибки могут быть проанализированы с помощью глобальной переменной @@ERROR, которая возвращает статус выполнения последней команды Transact-SQL: 0 указывает на успешное выполнение, а ненулевое значение указывает, что имела место ошибка.