Создание хранимых процедур

Содержание

Слайд 2

Сценарий может состоять из одного или нескольких пакетов.

Сценарий может состоять из одного или нескольких пакетов.

Слайд 3

Пакет – это набор операторов SQL, одновременно передаваемых SQL –серверу и

Пакет – это набор операторов SQL, одновременно передаваемых SQL –серверу и

выполняемых как единая группа.
Пакеты выполняются интерактивно или в составе сценария.
Пакет содержит одну или несколько команд SQL. Команды пакета анализируются, компилируются и выполняются как единая группа.
Пакет отправляется на сервер с помощью команды GO .
Слайд 4

SQL Server компилирует операторы пакета в единую исполнимую единицу (план исполнения).

SQL Server компилирует операторы пакета в единую исполнимую единицу (план исполнения).

После этого по очереди выполняются операторы этого плана.
Ошибка при компиляции, например синтаксическая, останавливает процесс компиляции плана исполнения. В этом случае ни один из операторов пакета исполнен не будет.
Слайд 5

Слайд 6

Пакеты чаще всего используются для регламентации порядка следования заданий.

Пакеты чаще всего используются для регламентации порядка следования заданий.

Слайд 7

Слайд 8

В современной клиент-серверной вычислительной среде приложение взаимодействует с сервером баз данных

В современной клиент-серверной вычислительной среде приложение взаимодействует с сервером баз данных

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

Работа такой схеме основывается на использовании так называемого серверного кода (server-side

Работа такой схеме основывается на использовании так называемого серверного кода (server-side

code) - любого кода, выполняемого компьютером, на котором установлена СУБД.
Ядро СУБД выполняет этот код в базе данных и возвращает приложению только результат. Например, это может быть несколько колонок строки или вычисленное значение.
Слайд 10

Использование серверного кода значительно сокращает объем сетевого трафика, и тем самым

Использование серверного кода значительно сокращает объем сетевого трафика, и тем самым

увеличивает производительность базы данных в целом. Однако СУБД должна иметь встроенные средства для распознавания и обработки такого кода.
Многие фирмы-производители промышленных СУБД, в том числе Oracle, Microsoft предлагают процедурные расширения SQL, с помощью которых можно выполнять построчную обработку данных, использовать циклы, сложные вычисления и операции управления данными.
Слайд 11

PL/SQL является таким расширением SQL в СУБД Oracle, Transact SQL –

PL/SQL является таким расширением SQL в СУБД Oracle, Transact SQL –

в MS SQL Server.
Они позволяют создавать серверный код в виде объектов реляционной базы данных, таких, как хранимые процедуры, функции, пакеты и триггеры. Это дает возможность создавать такие объекты с целью сокращения сетевого трафика за счет переноса определенного объема обработки на сервер, особенно в тех случаях, когда эта обработка выполняется очень интенсивно.
Таким образом, разработка серверного кода сводится к решению следующих подзадач:
создание хранимых процедур;
создание функций;
создание триггеров.
Слайд 12

Процедурные расширения SQL описаны в документе SQL/PSM стандарта SQL99. Язык SQL

Процедурные расширения SQL описаны в документе SQL/PSM стандарта SQL99.
Язык SQL

расширен операторами управления CASE, IF, WHILE, REPEAT, LOOP и FOR.
В этом стандарте вводится поддержка процедур и функций, создаваемых операторами CREATE PROCEDURE и CREATE FUNCTION. В язык SQL введено использование переменных и применение обработчиков ошибок.
Слайд 13

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

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

касались в первую очередь процедурных расширений.
Практически в каждой СУБД применяется свой процедурный язык. Стандарт для процедурных расширений представлен спецификацией SQL/PSM.
Слайд 14

Перечень процедурных расширений для самых популярных СУБД

Перечень процедурных расширений для самых популярных СУБД

Слайд 15

Операторы SQL могут выполняться разными способами: по одному, как сценарии, пакетами,

Операторы SQL могут выполняться разными способами:
по одному,
как сценарии,
пакетами,


в составе хранимых процедур или триггеров.
Слайд 16

Хранимая процедура - это специальный тип пакета инструкций Transact-SQL Основное различие

Хранимая процедура - это специальный тип пакета инструкций Transact-SQL
Основное различие

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

Как правило, в работе с БД используются одни и те же

Как правило, в работе с БД используются одни и те же

запросы, либо набор последовательных запросов. Хранимые процедуры позволяют объединить последовательность запросов и сохранить их на сервере
Хранимые процедуры представляют собой набор команд, состоящий из одного или нескольких операторов SQL, сохраняемый в базе данных в откомпилированном виде.
Слайд 18

Хранимые процедуры могут включать любые операторы SQL, а также некоторый набор

Хранимые процедуры могут включать любые операторы SQL, а также некоторый набор

операторов, которые управляют ходом выполнения программы.
Слайд 19

С точки зрения приложений, работающих с БД, хранимые процедуры – это

С точки зрения приложений, работающих с БД, хранимые процедуры – это

подпрограммы, которые выполняются на сервере.
По отношению к БД – это объекты, которые хранятся в БД.
Слайд 20

Одна процедура может быть использована в любом количестве клиентских приложений, что

Одна процедура может быть использована в любом количестве клиентских приложений, что позволяет

существенно снизить трудозатраты на создание прикладного программного обеспечения.
Слайд 21

Обычно все ограничения целостности в виде правил и алгоритмов обработки данных

Обычно все ограничения целостности в виде правил и алгоритмов обработки данных

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

Подобный подход делает весьма простой модификацию алгоритмов обработки данных, тотчас же

Подобный подход делает весьма простой модификацию алгоритмов обработки данных, тотчас же

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

Слайд 24

Хранимые процедуры могут быть активизированы пользовательскими приложениями, другими хранимыми процедурами и триггерами.

Хранимые процедуры могут быть активизированы пользовательскими приложениями, другими хранимыми процедурами и

триггерами.
Слайд 25

Также как и любые процедуры в стандартных языках программирования, хранимые процедуры

Также как и любые процедуры в стандартных языках программирования, хранимые процедуры

могут иметь входные и выходные параметры или не иметь их.
Слайд 26

Системные хранимые процедуры хранятся в базе данных master, их имена начинаются

Системные хранимые процедуры хранятся в базе данных master, их имена начинаются

с префикса sp_ (sp_helpconstraint, sp_helpindex и т.д).
Системные хранимые процедуры предназначены для выполнения различных административных действий. Практически все действия по администрированию сервера выполняются с их помощью
.
Слайд 27

Запускаются хранимые процедуры всех типов с помощью команды EXECUTE, которую можно

Запускаются хранимые процедуры всех типов с помощью команды EXECUTE, которую можно

сократить до ЕХЕС.
Например, хранимая процедура sp_helplogins формирует два отчета об именах учетных записей и соответствующих им в каждой БД пользователях
EXEC sp_helplogins;
Слайд 28

Временные хранимые процедуры хранятся в базе данных tempdb и удаляются автоматически

Временные хранимые процедуры хранятся в базе данных tempdb и удаляются автоматически

Слайд 29

Локальные временные хранимые процедуры могут быть вызваны только из того соединения,

Локальные временные хранимые процедуры могут быть вызваны только из того соединения,

в котором созданы. При создании такой процедуры ей необходимо дать имя, начинающееся с одного символа #.
Как и все временные объекты, хранимые процедуры этого типа автоматически удаляются при отключении пользователя, перезапуске или остановке сервера.
Слайд 30

Глобальные временные хранимые процедуры доступны для любых соединений сервера. Для определения

Глобальные временные хранимые процедуры доступны для любых соединений сервера.
Для определения

глобальной временной хранимой процедуры достаточно дать ей имя, начинающееся с символов ##.
Глобальные временные хранимые процедуры доступны для любых соединений сервера, на котором имеется такая же процедура.
Удаляются эти процедуры при перезапуске или остановке сервера, а также при закрытии соединения, в контексте которого они были созданы.
Слайд 31

Хранимая процедура после ее создания помещается в кэш процедур. Кэш процедур

Хранимая процедура после ее создания помещается в кэш процедур.
Кэш процедур

это пространство памяти, содержащее план выполнения операторов Transact-SQL составляющих процедуру.
Если в кэше есть план выполнения, то процедура выполняется быстрее, за счёт того, что серверу не нужно разбирать запрос и вырабатывать необходимые действия для решения поставленной задачи.
Слайд 32

Для просмотра кода хранимой процедуры служит системная процедура sp_helptext.

Для просмотра кода хранимой процедуры служит системная процедура sp_helptext.

Слайд 33

Слайд 34

Хранимая процедура компилируется один раз и после этого может выполняться многократно.

Хранимая процедура компилируется один раз и после этого может выполняться многократно.

Такая функциональность повышает производительность, поскольку отпадает необходимость в перекомпиляции операторов SQL.
Слайд 35

Как серверные программы хранимые процедуры имеют следующие преимущества. Хранимые процедуры хранятся

Как серверные программы хранимые процедуры имеют следующие преимущества.
Хранимые процедуры хранятся в

компилированном виде, поэтому выполняются быстрее, чем пакеты или запросы.
Выполнение обработки данных на сервере, а не на рабочей станции, значительно снижает нагрузку на локальную сеть.
Слайд 36

хранимые процедуры проще использовать: они могут состоять из десятков и сотен

хранимые процедуры проще использовать: они могут состоять из десятков и сотен

команд, но для их запуска достаточно указать всего лишь имя нужной хранимой процедуры.
Это позволяет уменьшить размер запроса, посылаемого от клиента на сервер.
Слайд 37

Хранимые процедуры можно рассматривать как важный компонент системы безопасности базы данных.

Хранимые процедуры можно рассматривать как важный компонент системы безопасности базы данных.


Если все клиенты осуществляют доступ к данным с помощью хранимых процедур, то прямой доступ к таблицам может быть запрещён, и все действия пользователей будут находиться под контролем.
Слайд 38

Хранимые процедуры скрывают от пользователя структуру базы данных и разрешают ему

Хранимые процедуры скрывают от пользователя структуру базы данных и разрешают ему

выполнение только тех операций, которые запрограммированы в хранимой процедуре.
Слайд 39

Хранимую процедуру можно создавать в следующем порядке: сначала написать операторы SQL,

Хранимую процедуру можно создавать в следующем порядке: сначала написать операторы SQL,

которые должны быть включены в хранимую процедуру, и проверить и работу, а затем, если нужный результат получен, можно создать хранимую процедуру.
Слайд 40

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

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

использоваться параметры, имена которых, как и имена локальных переменных, должны начинаться с символа @. В одной хранимой процедуре можно задать множество параметров, разделённых запятыми.
В теле процедуры не должны применяться локальные переменные, чьи имена совпадают с именами параметров этой процедуры.
Слайд 41

Для создания хранимой процедуры используется оператор SQL CREATE PROCEDURE. Синтаксис: CREATE

Для создания хранимой процедуры используется оператор SQL CREATE PROCEDURE.
Синтаксис:
CREATE PROCEDURE

<имя процедуры> (@<имя перем1> <тип данных>, @<имя перем2> <тип данных>…)
[@параметр тип данных[=значение по умолчанию] [OUTPUT]
[WITH
 { RECOMPILE
 |ENCRYPTION
 |RECOMPILE,ENCRYPTION}]
 AS <тело процедуры>
Слайд 42

Ключевое слово RECOMPILE определяет режим компиляции. Если RECOMPILE задано, то процедура

Ключевое слово RECOMPILE определяет режим компиляции.
Если RECOMPILE задано, то процедура

будет перекомпилироваться всякий раз, когда она будет передаваться на выполнение (план выполнения не кэшируется, при каждом выполнении создаётся новый план).
Слайд 43

Ключевое слово ENCRYPTION определяет режим, при котором исходный текст хранимой процедуры

Ключевое слово ENCRYPTION определяет режим, при котором исходный текст хранимой процедуры

не сохраняется в БД.
Кроме имени все остальные параметры являются необязательными.
Каждая хранимая процедура компилируется при первом выполнении. Описание процедуры совместно с планом ее работы хранится в системных таблицах.
Слайд 44

Процедуры могут быть процедурами или функциями. Эти понятия трактуются традиционно. В

Процедуры могут быть процедурами или функциями. Эти понятия трактуются традиционно.
В

процедуре может быть использовано ключевое слово OUTPUT, которое определяет, что данный параметр является выходным.
Слайд 45

Выполнение процедуры осуществляется с помощью команды EXEC[UTE] имя процедуры [@параметр = значение]

Выполнение процедуры осуществляется с помощью команды
EXEC[UTE] имя процедуры [@параметр =

значение]
Слайд 46

Значение параметров задается путем передачи значений по позиции или с заданием

Значение параметров задается путем передачи значений по позиции или с заданием

ссылок на имена.
Передача параметра со ссылками на имена осуществляется следующим образом: @параметр = значение.
При этом значения параметров можно указывать в любом порядке, а параметры, имеющие значение по умолчанию, опускать.
Слайд 47

Передача значений без ссылок на имена параметров (передача значений по позиции).

Передача значений без ссылок на имена параметров (передача значений по позиции).

Если указываются только значения, их следует перечислять в порядке определения в операторе CREATE PROC.
Слайд 48

Нельзя присвоить параметру значение по умолчанию, просто пропустив его при перечислении.

Нельзя присвоить параметру значение
по умолчанию, просто пропустив его при перечислении.


Если требуется опустить параметры, для которых определено значение по умолчанию, достаточно явного указания имен параметров при вызове хранимой процедуры.
Таким способом можно перечислять параметры и их значения в произвольном порядке.
Слайд 49

Если вызов хранимой процедуры не является единственной командой в пакете, то

Если вызов хранимой процедуры не является единственной командой в пакете, то

присутствие команды EXECUTE обязательно.
Эта команда требуется для вызова процедуры из тела другой процедуры или триггера
При вызове процедуры указываются либо имена параметров со значениями, либо только значения без имени параметра. Их комбинирование не допускается.
Слайд 50

Возврат значений при помощи параметров вывода Для использования параметра вывода ключевое

Возврат значений при помощи параметров вывода
Для использования параметра вывода ключевое слово

OUTPUT должно указываться как в операторе CREATE PROC, так и в операторе EXEC.
Вызывающий оператор должен указать для параметра вывода имя переменной.
Слайд 51

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

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

касались в первую очередь процедурных расширений.
Практически в каждой СУБД применяется свой процедурный язык. Стандарт для процедурных расширений представлен спецификацией SQL/PSM.
Слайд 52

Слайд 53

Слайд 54

Слайд 55

Слайд 56

Слайд 57

Слайд 58

Слайд 59

Слайд 60

Слайд 61

Слайд 62

Элементы Transact SQL для управления ходом выполнения

Элементы Transact SQL
для управления ходом
выполнения

Слайд 63

Операторы управления выполнением программы: В процедурах могут использоваться следующие операторы управления:

Операторы управления выполнением программы:
В процедурах могут использоваться следующие операторы управления:
1.

Оператор условия
IF <выражение>
BEGIN
<операторы>
END
[ELSE]
[IF <выражение>]
BEGIN
<операторы>
END
Слайд 64

IF (SELECT COUNT(*) FROM STAFF WHERE Position = 'менеджер' ) PRINT

IF (SELECT COUNT(*)
FROM STAFF WHERE Position = 'менеджер' ) < 3
PRINT

'Недостаточно менеджеров '
ELSE
BEGIN
PRINT ' В компании достаточное количество менеджеров'
SELECT fname FROM STAFF WHERE Position = 'менеджер'
END
go
Слайд 65

2. Выбор одного из нескольких значений CASE WHEN THEN WHEN THEN WHEN THEN … ELSE END

2. Выбор одного из нескольких значений
CASE <переменная>
WHEN <условие1> THEN

<оператор1>
WHEN <условие2> THEN <оператор2>
WHEN <условие3> THEN <оператор3>

ELSE <оператор>
END
Слайд 66

3. Циклическое выполнение операций WHILE BEGIN END В этом операторе можно

3. Циклическое выполнение операций
WHILE <логическое выражение>
BEGIN
<операторы>
END
В

этом операторе можно также использовать операторы BREAK и CONTINUE, которые позволяют прервать выполнение этого цикла.
Слайд 67

Слайд 68

Оператор RETURN выполняет безусловный выход из процедуры.

Оператор RETURN выполняет безусловный выход из процедуры.

Слайд 69

В программу можно включать комментарии. Однострочные комментарии отделяются от оператора двумя

В программу можно включать комментарии.
Однострочные комментарии отделяются от оператора двумя

дефисами (--).
Многострочные комментарии заключаются в символы: (/*…*/).
Слайд 70

Для объявления переменных, которые используются в процедуре, служит директива DECLARE. Идентификаторы

Для объявления переменных, которые используются в процедуре, служит директива DECLARE.
Идентификаторы

переменных начинаются с символа @.
Если необходимо присвоить переменной какое-либо значение, используется ключевое слово SET или SELECT.
Слайд 71

Слайд 72

Неправильное использование SET:

Неправильное использование SET:

Слайд 73

Слайд 74

Слайд 75

1) DECLARE @T INTEGER SELECT @T= COUNT(*) FROM Property SELECT @T

1)
DECLARE @T INTEGER
SELECT @T= COUNT(*) FROM Property
SELECT @T
2)
DECLARE @T INTEGER
SET @T=

(SELECT COUNT(*) FROM Property)
SELECT @T
Слайд 76

Глобальные переменные Обработка ошибок SQL Server позволяет обрабатывать ошибки, используя глобальную

Глобальные переменные

Обработка ошибок

SQL Server позволяет обрабатывать ошибки, используя глобальную переменную @@ERROR.

Если генерируется ошибка, то переменная @@ERROR содержит соответствующий номер ошибки, в случае же успеха она возвращает 0.
Хранящееся значение номера ошибки может быть положительным, отрицательным, или равным 0. Значение переменной @@ERROR непостоянно, т.е. оно изменяется при выполнении каждой команды. Рассмотрим следующий пример:
Слайд 77

Слайд 78

Недостатки подхода с использованием @@Error Значение переменной @@Error должно быть проверено

Недостатки подхода с использованием @@Error
Значение переменной @@Error должно быть проверено сразу

после выполнения запроса/команды.
Так как @@Error постоянно меняется, то мы вынуждены заводить отдельную переменную для сохранения и вывода кода ошибки.
Слайд 79

@‍@TRANCOUNT - число незавершённых транзакций IF (@‍@TRANCOUNT>0) BEGIN RAISERROR (‘задание не


@‍@TRANCOUNT - число незавершённых транзакций
IF (@‍@TRANCOUNT>0)
BEGIN
RAISERROR (‘задание не может

быть выполнено в транзакции’, 16,1)
RETURN
END

Другим возможным способом обработки ошибок является использование глобальных переменных @@rowcount и @@trancount.

Слайд 80

@‍@ROWCOUNT возвращает количество строк, затронутых (возвращённых, удалённых, изменённых) последним запросом. Например:

@‍@ROWCOUNT возвращает количество строк, затронутых (возвращённых, удалённых, изменённых) последним запросом.
Например:


UPDATE STAFF SET LastName = ‘Иванков’
WHERE LastName = ‘Иванов’
IF(@@ROWCOUNT=0)
BEGIN
PRINT ‘Внимание : Ни одна запись не была изменена’
RETURN
END
Слайд 81

Инструкция RAISERROR возвращает пользовательское сообщение об ошибке, позволяет пользователям получать записи

Инструкция RAISERROR возвращает пользовательское сообщение об ошибке, позволяет пользователям получать записи

из системной таблицы sysmessages или создавать сообщение динамически, на основе заданного уровня и кода ошибки.
Синтаксис:
RAISERROR({код ошибки|символьная строка} уровень важности ошибки, состояние).
Слайд 82

Уровень важности ошибки является указанием на то, какие меры следует принимать с учетом этой ошибки.

Уровень важности ошибки является указанием на то, какие меры следует принимать

с учетом этой ошибки.
Слайд 83

Система обозначений уровней важности ошибок охватывает широкий спектр сообщений об ошибках,

Система обозначений уровней важности ошибок охватывает широкий спектр сообщений об

ошибках, включая те, которые являются
информационными (со значениями уровней важности 1-18),
относящимися к системному уровню (19-25),
рассматриваются как катастрофические (20-25).
При возникновении ошибок с уровнем важности 20 и выше автоматически завершается работа пользовательских соединений.
Слайд 84

Если необходимо завершить выполнение процедуры и активировать в клиентской программе сообщение,

Если необходимо завершить выполнение процедуры и активировать в клиентской программе сообщение,

как правило, указывается уровень важности 16.
Слайд 85

Уровень важности ошибки от 0 до 18 может указать любой пользователь.

Уровень важности ошибки от 0 до 18 может указать любой пользователь.

Уровни важности от 19 до 25 могут быть указаны только членами предопределенной роли сервера sysadmin.
Слайд 86

Состояние - целое число, которое идентифицирует источник сообщения, если оно может

Состояние - целое число, которое идентифицирует источник сообщения, если оно может

генерироваться из нескольких мест в программе.
Если одна и та же пользовательская ошибка возникает в нескольких местах, то при помощи уникального номера состояния для каждого местоположения можно определить, в каком месте кода появилась ошибка.
Слайд 87

Сообщение об ошибке можно стандартизировать и использовать многократно. Для этого сообщение

Сообщение об ошибке можно стандартизировать и использовать многократно. Для этого сообщение

следует определить в БД. Синтаксис включения сообщения в БД:
Sp_addmessage код сообщения, код важности, текст
сообщения[,язык[FALSE|TRUE],REPLACE]]]
Слайд 88

Флаг FALSE|TRUE определяет, должно ли сообщение записываться в журнал ошибок. REPLACE

Флаг FALSE|TRUE определяет, должно ли сообщение записываться в журнал ошибок.
REPLACE

заменяет существующее сообщение с указанным кодом.
Слайд 89

Начиная с SQL Server 2005, появилась возможность обработать исключения, используя операторы

Начиная с SQL Server 2005, появилась возможность обработать исключения, используя операторы

try и catch.

CREATE PROCEDURE proc1
AS BEGIN
BEGIN TRY SELECT 1/0
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE();
END CATCH
END

Обнаружена ошибка: деление на ноль.

Слайд 90

Внутри блока CATCH доступны функции для обработки исключений: ERROR_NUMBER() — номер

Внутри блока CATCH доступны функции для обработки исключений:
ERROR_NUMBER() — номер ошибки;
ERROR_SEVERITY()

— уровень серьезности;
ERROR_MESSAGE() — полный текст сообщения об ошибке.
Слайд 91

Конструкция TRY...CATCH перехватывает все ошибки исполнения с кодом серьезности, большим чем

Конструкция TRY...CATCH перехватывает все ошибки исполнения с кодом серьезности, большим чем

10, которые не закрывают подключение к базе данных
Слайд 92

Ошибки, обнаруженные в блоке CATCH, не передаются в вызывающее приложение. Если

Ошибки, обнаруженные в блоке CATCH, не передаются в вызывающее приложение. Если

какие-либо сведения об ошибке должны быть возвращены в приложение, код в блоке CATCH должен выполнить передачу этой ошибки, используя любые доступные механизмы, такие как результирующие наборы инструкции SELECT либо инструкции RAISERROR и PRINT.
Слайд 93

CREATE PROCEDURE insert_data @a int, @b int BEGIN TRY BEGIN TRANSACTION

CREATE PROCEDURE insert_data @a int, @b int
BEGIN TRY
BEGIN TRANSACTION


INSERT INTO sometable(a, b) VALUES (@a, @b)
INSERT INTO sometable(a, b) VALUES (@b, @a)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@trancount > 0 ROLLBACK TRANSACTION
DECLARE @msg nvarchar(2048) = error_message()
RAISERROR (@msg, 16, 1)
RETURN
END CATCH
Слайд 94

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

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

с именами параметров этой процедуры.
Слайд 95

Пример: создается хранимая процедура для вычисления суммы 2 чисел. USE GO

Пример: создается хранимая процедура для вычисления суммы 2 чисел.
USE <имя БД>


GO
CREATE PROCEDURE SUMMA
@A smallint,
@B smallint,
@S smallint OUTPUT
AS
SET @S= @A+@B
Слайд 96

DECLARE @S INT EXEC SUMMA 2, 3, @S OUTPUT SELECT @S

DECLARE @S INT
EXEC SUMMA 2, 3, @S OUTPUT
SELECT @S

Слайд 97

Пример. Создать процедуру для начисления стипендии студентам в зависимости от полученного

Пример.
Создать процедуру для начисления стипендии студентам в зависимости от полученного среднего

балла. В процедуру передаётся значение среднего балла, в зависимости от которого система устанавливает ставку стипендии.
Слайд 98

CREATE PROCEDURE STIP @N TINYINT --средний балл AS BEGIN DECLARE @X

CREATE PROCEDURE STIP
@N TINYINT --средний балл
AS
BEGIN
DECLARE @X

REAL
SELECT @X=
CASE @N
WHEN 8 THEN 200
WHEN 9 THEN 300
WHEN 10 THEN 400
ELSE 0
END
PRINT ‘Установлена стипендия:’
PRINT @X
END
Слайд 99

Вызов процедуры: EXEC STIP 10

Вызов процедуры:
EXEC STIP 10

Слайд 100

ALTER PROCEDURE [dbo].[STIP] @N TINYINT, @X INT OUTPUT AS BEGIN SELECT

ALTER PROCEDURE [dbo].[STIP]
@N TINYINT, @X INT OUTPUT
AS
BEGIN
SELECT @X=


CASE @N
WHEN 8 THEN 200
WHEN 9 THEN 300
WHEN 10 THEN 400
ELSE 0
END
END
Слайд 101

Запуск процедуры: DECLARE @Y INT EXEC STIP 6, @Y OUTPUT SELECT

Запуск процедуры:
DECLARE @Y INT
EXEC STIP 6, @Y OUTPUT
SELECT ‘Установлена стипендия:

‘ + CAST (@Y AS VARCHAR(3))
Слайд 102

Пример создания процедуры с входным параметром и значением по умолчанию для

Пример создания процедуры с
входным параметром и значением по умолчанию
для

изменения значения цены (по умолчанию –
увеличения в 2 раза)
CREATE PROC UPDATE_ Price
@p INT = 2
AS UPDATE PRICES
SET price = price *@p
Слайд 103

EXEC UPDATE_Price 4 или EXEC UPDATE_Price - будет использовано значение по умолчанию.

EXEC UPDATE_Price 4
или
EXEC UPDATE_Price - будет использовано значение по умолчанию.


Слайд 104

Создать процедуру для повышения заработной платы сотрудников в зависимости от количества объетов, за которые они отвечают

Создать процедуру для повышения заработной платы сотрудников в зависимости от количества

объетов, за которые они отвечают
Слайд 105

CREATE PROCEDURE [dbo].[INCREASE_SALARY] (@Staff_no nchar(9), @percent decimal) AS DECLARE @S int

CREATE PROCEDURE [dbo].[INCREASE_SALARY] (@Staff_no nchar(9), @percent decimal)
AS
DECLARE @S int
SELECT @S

= COUNT (*) FROM PROPERTY WHERE Staff_no = @Staff_no
UPDATE STAFF SET Salary =
CASE
WHEN ( @S>2) THEN Salary * (100 + 3*@percent) / 100
WHEN (@S>1) THEN Salary * (100 + 2*@percent) / 100
ELSE Salary * (100 + @percent) / 100
END
WHERE Staff_no = @Staff_no
Слайд 106

Выражение IF EXISTS() Выражение IF EXISTS() использует в качестве условия наличие

Выражение IF EXISTS()
Выражение IF EXISTS() использует в качестве условия наличие какой-либо

строки, возвращённой инструкцией SELECT.
Этот метод работает быстрее, чем проверка условия @@ROWCOUNT>0, потому что не требуется подсчет общего количества строк. Как только хотя бы одна строка удовлетворяет условию IF EXISTS(), запрос может продолжать выполнение.
Слайд 107

В следующем примере выражение IF EXISTS используется для проверки наличия у

В следующем примере выражение IF EXISTS используется для проверки наличия у

сотрудника с кодом ‘BMO550262’ каких-либо объектов перед удалением его из базы. Если у данного сотрудника имеются объекты, удаление не производится.
IF EXISTS(SELECT * FROM PROPERTY WHERE STAFF_NO = ‘BMO550262’)
PRINT 'Невозможно удалить сотрудника поскольку в базе имеются связанные с ним записи'
ELSE
DELETE * FROM STAFF WHERE STAFF_NO = ‘BMO550262’
Слайд 108

3. Процедура для повышения стипендии студентам, прослушавшим спецкурс по заданному предмету.

3. Процедура для повышения стипендии студентам, прослушавшим спецкурс по заданному предмету.

В процедуру будут передаваться следующие параметры: @NOM_ZACH – номер зачетки, @PKOD – код предмета и @IND – процент индексации стипендии.
Слайд 109

CREATE PROC IND_STIP (@NOM_ZACH int, @PKOD smallint, @IND real) AS IF

CREATE PROC IND_STIP
(@NOM_ZACH int,
@PKOD smallint,
@IND real)
AS
IF

EXISTS (SELECT PKOD, NOM_ZACH
FROM USP
WHERE NOM_ZACH = @NOM_ZACH
AND PKOD = @PKOD)
UPDATE STUDENTS SET STIP = STIP*@IND WHERE NOM_ZACH = @NOM_ZACH
Слайд 110

Для запуска процедуры: EXEC IND_STIP @NOM_ZACH = 1298, @PKOD =1212, @IND=1.2

Для запуска процедуры:
EXEC IND_STIP @NOM_ZACH = 1298, @PKOD =1212, @IND=1.2

Слайд 111

4. Создать процедуру для повышения заработной платы сотрудника только в том

4. Создать процедуру для повышения заработной платы сотрудника только в том

случае, если за ним закреплён хотя бы один объект собственности в таблице Property (номер сотрудника и процент повышения заработной платы передаются в процедуру как параметры).
Слайд 112

CREATE PROC NEW_SALARY (@Staff_no char(9), @Procent decimal) AS IF EXISTS (SELECT

CREATE PROC NEW_SALARY
(@Staff_no char(9),
@Procent decimal)
AS
IF EXISTS (SELECT property_no


FROM PROPERTY
WHERE Staff_No= @Staff_No )
UPDATE STAFF SET Salary=Salary*(100+ @Procent)/100
WHERE Staff_No= @STAFF_NO
Для запуска процедуры:
EXEC NEW_SALARY @Staff_No = ‘BMO5502601’, @PROCENT=10
Слайд 113

CREATE PROC NEW_SALARY (@Staff_no char(9)) AS IF (SELECT count(*) FROM PROPERTY

CREATE PROC NEW_SALARY
(@Staff_no char(9))
AS
IF (SELECT count(*)
FROM PROPERTY
WHERE

Staff_No= @Staff_No )<3
begin
UPDATE STAFF SET Salary=Salary*2
WHERE Staff_No= @STAFF_NO
end
ELSE
begin
UPDATE STAFF SET Salary=Salary*4
WHERE Staff_No= @STAFF_NO
end
Слайд 114

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

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

плату выше средней
CREATE PROC my_proc1
AS
BEGIN
DECLARE @m money
SELECT @m=AVG(SALARY) FROM STAFF
RETURN @m
END
DECLARE @AVSAL money
exec @AVSAL=my_proc1
select @AVSAL
go
Слайд 115

ALTER PROC my_proc2 @count_number INT OUTPUT AS BEGIN DECLARE @AVSAL money

ALTER PROC my_proc2 @count_number INT OUTPUT
AS
BEGIN
DECLARE @AVSAL money
EXEC @AVSAL =

my_proc1
SELECT @count_number =COUNT(*) FROM STAFF WHERE SALARY> @AVSAL
END
DECLARE @c INT
exec my_proc2 @c OUTPUT
select @c