+ All Categories
Home > Documents > Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft...

Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft...

Date post: 13-Aug-2020
Category:
Upload: others
View: 22 times
Download: 0 times
Share this document with a friend
56
Министерство образования и науки Российской Федерации Ярославский государственный университет им. П. Г. Демидова Кафедра компьютерной безопасности и математических методов обработки информации Transact-SQL Методические указания Рекомендовано Научно-методическим советом университета для студентов, обучающихся по направлению Прикладная математика и информатика Ярославль ЯрГУ 2013
Transcript
Page 1: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

1

Министерство образования и науки Российской ФедерацииЯрославский государственный университет им. П. Г. Демидова

Кафедра компьютерной безопасности и математических методов обработки информации

Transact-SQL

Методические указания

РекомендованоНаучно-методическим советом университета для студентов, обучающихся по направлению

Прикладная математика и информатика

ЯрославльЯрГУ2013

Page 2: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

2

УДК 004.65(072) ББК З973.233-018.2я73

Т 65Рекомендовано

Редакционно-издательским советом университетав качестве учебного издания. План 2013 года

Рецензенткафедра компьютерной безопасности

и математических методов обработки информации

Составитель О. В. Власова

Т 65Transact-SQL : методические указания / сост. О. В. Вла-

сова ; Яросл. гос. ун-т им. П. Г. Демидова. – Ярославль : ЯрГУ, 2013. – 56 с.

В методических указаниях по учебному курсу «Базы данных и экспертные системы» рассматривается язык Transact-SQL, ис-пользуемый в одной из самых популярных систем управления ре-ляционными базами данных – MS SQL Server. Указания ориентиро-ваны в первую очередь на практическое применение языка Transact-SQL: рассмотрены средства управления транзакциями, приведены сведения о хранимых процедурах, пользовательских и встроенных функциях, рассмотрены примеры использования триггеров. Содер-жатся теоретические сведения, включая достаточно подробное опи-сание синтаксиса операторов Transact-SQL, приведены указания по их использованию. Методические указания содержат большое количество примеров по использованию операторов Transact-SQL, которые могут быть полезны на этапе освоения материала и высту-пать в качестве вопросов для самопроверки.

Предназначено для студентов, обучающихся по направ-лению 010400.62 Прикладная математика и информатика (дис-циплина «Базы данных и экспертные системы», цикл Б3), оч-ной формы обучения.

УДК 004.65(072) ББК З973.233-018.2я73

© ЯрГУ, 2013

Page 3: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

3

ВведениеSQL (Structured Query Language) – это универсальный ком-

пьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных (язык струк-турированных запросов).

Однако SQL в его исходном виде является информационно-логическим языком, а не языком программирования, но тем не менее SQL предусматривает возможность его процедурных расширений, с учётом которых язык уже вполне может рассма-триваться в качестве языка программирования.

В настоящее время широко распространенны следующие процедурные расширения SQL:

Тип базы данных Процедурные расширения SQL

Microsoft SQL Transact-SQL

Microsoft Jet/Access Jet SQLMySQL SQL/PSM (SQL/Persistent Stored Module)Oracle PL/SQL (Procedural Language/SQL)IBM DB2 SQL PL (SQL Procedural Language)InterBase/Firebird PSQL (Procedural SQL)

Transact-SQL – это процедурное расширение языка SQL ком-

паний Microsoft. SQL был расширен такими дополнительными возможностями как:

• локальные и глобальные переменные, • управляющие операторы, • различные дополнительные функции для обработки

строк, дат, математики и т. п.Язык Transact-SQL является ключом к использованию SQL

Server. Все приложения, взаимодействующие с экземпляром SQL Server, независимо от их реализации и пользовательского интер-фейса, отправляют серверу инструкции Transact-SQL.

Page 4: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

4

1. ТранзакцииЯзык запросов Transact-SQL взял свое название от слова

транзакция. Рассмотрим это понятие на примере. Допустим, что у нас есть таблица, содержащая, как минимум, два поля – номер счета в банке и сумма денег на этом счету.R1([Номер счета], Баланс, …)Нам необходимо перевести 100 единиц со счета «А123» на счет «Б123». Для этого нужно выполнить запрос, уменьшающий сум-му первого счета на 100 единиц.UPDATE R1 SET Баланс = Баланс – 100 WHERE [Номер счета]= ‘A123’А затем запрос, увеличивающий значение второго счета.UPDATE R1 SET Баланс = Баланс + 100 WHERE [Номер счета]= ‘Б123’

Все вроде бы хорошо. Но что произойдет, если после умень-шения первого счета случится сбой и сервер не успеет пополнить другой счет? Деньги уже сняты, но никуда не записаны, а значит, они пропали. Если выполнять операции в обратном порядке: сна-чала пополнять счет, а потом снимать деньги, то если снятие не успеет произойти, то банк может оказаться банкротом, ведь по-является лишняя сумма, снятия не происходит.

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

Концепция транзакций – неотъемлемая часть любой клиент-серверной базы данных.

Под транзакцией понимается неделимая с точки зрения воз-действия на БД последовательность операторов манипулирования данными (удаления, вставки, модификации), приводящая к одно-му из двух возможных результатов: либо последовательность вы-полняется, если все операторы правильные, либо вся транзакция откатывается, если хотя бы один оператор не может быть успешно

Page 5: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

5

выполнен. Обработка транзакций гарантирует целостность инфор-мации в базе данных. Таким образом, транзакция переводит базу данных из одного целостного состояния в другое.

Поддержание механизма транзакций – показатель уровня развитости СУБД. Корректное поддержание транзакций одно-временно является основой обеспечения целостности БД, а так-же составляет основу изолированности в многопользовательских системах, где с одной БД параллельно могут работать несколько пользователей или прикладных программ.

При выполнении транзакции СУБД должна придерживаться определенных правил обработки набора команд, входящих в тран-закцию (Atomicity, Consistency, Isolation, Durability (ACID) – неде-лимость, согласованность, изолированность, устойчивость).

ACID-свойства транзакций:• Транзакция неделима в том смысле, что представляет со-

бой единое целое. Все ее компоненты либо имеют место, либо нет. Не бывает частичной транзакции. Если может быть выпол-нена лишь часть транзакции, она отклоняется.

• Транзакция является согласованной, потому что не на-рушает бизнес-логику и отношения между элементами данных. Это свойство очень важно при разработке клиент-серверных си-стем, поскольку в хранилище данных поступает большое количе-ство транзакций от разных систем и объектов. Если хотя бы одна из них нарушит целостность данных, то все остальные могут вы-дать неверные результаты.

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

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

Page 6: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

6

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

Блокировки Блокировкой называется временное ограничение на выпол-

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

Блокировка представляет собой метод управления параллель-ными процессами, при котором объект БД не может быть модифи-цирован без ведома транзакции, т. е. происходит блокирование до-ступа к объекту со стороны других транзакций, чем исключается не-предсказуемое изменение объекта. Различают два вида блокировки:

• блокировка записи – транзакция блокирует строки в таб-лицах таким образом, что запрос другой транзакции к этим стро-кам будет отменен;

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

В СУБД используют протокол доступа к данным, позволя-ющий избежать проблемы параллелизма. Его суть заключается в следующем:

• транзакция, результатом действия которой на строку дан-ных в таблице является ее извлечение, обязана наложить блоки-ровку чтения на эту строку;

• транзакция, предназначенная для модификации строки данных, накладывает на нее блокировку записи;

Page 7: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

7

• если запрашиваемая блокировка на строку отвергается из-за уже имеющейся блокировки, то транзакция переводится в режим ожидания до тех пор, пока блокировка не будет снята;

• блокировка записи сохраняется вплоть до конца выпол-нения транзакции.

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

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

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

• проблема «грязного» чтения возможна в том случае, если пользователь выполняет сложные операции обработки дан-ных, требующие множественного изменения данных перед тем, как они обретут логически верное состояние. Если во время изме-нения данных другой пользователь будет считывать их, то может оказаться, что он получит логически неверную информацию. Для исключения подобных проблем необходимо производить считы-вание данных после окончания всех изменений;

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

Page 8: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

8

в данные изменения, поэтому при повторном чтении первая транзакция получит уже иной набор данных, что приводит к на-рушению их целостности или логической несогласованности;

• проблема чтения фантомов появляется после того, как одна транзакция выбирает данные из таблицы, а другая вставляет или удаляет строки до завершения первой. Выбранные из табли-цы значения будут некорректны.

Для решения перечисленных проблем в специально разрабо-танном стандарте определены четыре уровня блокирования. Уро-вень изоляции транзакции определяет, могут ли другие (конкури-рующие) транзакции вносить изменения в данные, измененные те-кущей транзакцией, а также может ли текущая транзакция видеть изменения, произведенные конкурирующими транзакциями, и на-оборот. Каждый последующий уровень поддерживает требования предыдущего и налагает дополнительные ограничения:

• уровень 0 – запрещение «загрязнения» данных. Этот уровень требует, чтобы изменять данные могла только одна тран-закция; если другой транзакции необходимо изменить те же дан-ные, она должна ожидать завершения первой транзакции;

• уровень 1 – запрещение «грязного» чтения. Если тран-закция начала изменение данных, то никакая другая транзакция не сможет прочитать их до завершения первой;

• уровень 2 – запрещение неповторяемого чтения. Если транзакция считывает данные, то никакая другая транзакция не сможет их изменить. Таким образом, при повторном чтении они будут находиться в первоначальном состоянии;

• уровень 3 – запрещение фантомов. Если транзакция обращается к данным, то никакая другая транзакция не сможет добавить новые или удалить имеющиеся строки, которые могут быть считаны при выполнении транзакции. Реализация этого уровня блокирования выполняется путем использования блоки-ровок диапазона ключей. Подобная блокировка накладывается не на конкретные строки таблицы, а на строки, удовлетворяющие определенному логическому условию.

Page 9: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

9

Управление транзакциями в среде MS SQL ServerSQL Server поддерживает три вида определения транзакций:• явное;• автоматическое;• подразумеваемое.По умолчанию SQL Server работает в режиме автоматиче-

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

Когда пользователю понадобится создать транзакцию, вклю-чающую несколько команд, он должен явно указать транзакцию.

Сервер работает только в одном из двух режимов определе-ния транзакций: автоматическом или подразумевающемся. Он не может находиться в режиме исключительно явного определения транзакций. Этот режим работает поверх двух других.

Для установки режима автоматического определения тран-закций используется команда:

SET IMPLICIT_TRANSACTIONS OFFПри работе в режиме неявного (подразумевающегося) нача-

ла транзакций SQL Server автоматически начинает новую тран-закцию, как только завершена предыдущая. Установка режима подразумевающегося определения транзакций выполняется по-средством другой команды:

SET IMPLICIT_TRANSACTIONS ON

Явные транзакцииЯвные транзакции требуют, чтобы пользователь указал на-

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

первоначальные значения изменяемых данных и момент начала транзакции;BEGIN TRAN[SACTION] [имя_транзакции | @имя_переменной_транзакции ][WITH MARK [‘описание’]]

Page 10: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

10

Опция WITH MARK указывает, что транзакция маркирована в журнале транзакций.

Конец транзакции: если в теле транзакции не было ошибок, то эта команда предписывает серверу зафиксировать все измене-ния, сделанные в транзакции, после чего в журнале транзакций по-мечается, что изменения зафиксированы и транзакция завершена;COMMIT [TRAN[SACTION][имя_транзакции | @имя_переменной_транзакции]]

Создание внутри транзакции точки сохранения: СУБД сохраняет состояние БД в текущей точке и присваивает сохра-ненному состоянию имя точки сохранения;SAVE TRAN[SACTION][имя_точки_сохранеия | @имя_переменной_точки_сохранения]

Откат транзакции: когда сервер встречает эту команду, происходит откат транзакции, восстанавливается первоначаль-ное состояние системы и в журнале транзакций отмечается, что транзакция была отменена. Приведенная ниже команда от-меняет все изменения, сделанные в БД после оператора BEGIN TRANSACTION, или отменяет изменения, сделанные в БД после точки сохранения, возвращая транзакцию к месту, где был вы-полнен оператор SAVE TRANSACTION.ROLLBACK [TRAN[SACTION][имя_транзакции | @имя_переменной_транзакции| имя_точки_сохранения | @имя_переменной_точки_сохранения]]

Функция @@TRANCOUNT возвращает количество актив-ных транзакций.

Пример использования явной транзакции:BEGIN TRANUPDATE R1 SET Баланс = Баланс – 100 WHERE [Номер счета]= ‘A123’UPDATE R1 SET Баланс = Баланс + 100 WHERE [Номер счета]= ‘Б123’COMMIT

Пример использования точек сохранения:BEGIN TRANSAVE TRANSACTION point1-- в point1 – первоначальное состояние R1UPDATE R1 SET Баланс = Баланс – 100 WHERE [Номер счета]= ‘A123’

Page 11: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

11

SAVE TRANSACTION point2 -- в point2 – со счёта А123 снято 100 единицUPDATE R1 SET Баланс = Баланс + 100 WHERE [Номер счета]= ‘Б123‘SAVE TRANSACTION point3-- в point3 – на счёт Б123 добавлено 100 единицUPDATE R1 SET Баланс = 0 WHERE [Номер счета] LIKE [АБ]+ ‘123’ROLLBACK TRANSACTION point3-- откат к точке point3SELECT * FROM R1ROLLBACK TRANSACTION point1-- откат к точке point1 (исходное состояние R1)SELECT * FROM R1COMMIT

Вложенные транзакцииВложенными называются транзакции, выполнение которых

инициируется из тела уже активной транзакции. Для создания вложенной транзакции пользователю не нужны какие-либо до-полнительные команды. Он просто начинает новую транзакцию, не закрыв предыдущую. Завершение транзакции верхнего уровня откладывается до завершения вложенных транзакций. Если тран-закция самого нижнего (вложенного) уровня завершена неудачно и отменена, то все транзакции верхнего уровня, включая тран-закцию первого уровня, будут отменены. Кроме того, если не-сколько транзакций нижнего уровня были завершены успешно (но не зафиксированы), однако на среднем уровне (не самая верхняя транзакция) неудачно завершилась другая транзакция, то в соответствии с требованиями ACID произойдет откат всех транзакций всех уровней, включая успешно завершенные. Толь-ко когда все транзакции на всех уровнях завершены успешно, происходит фиксация всех сделанных изменений в результате успешного завершения транзакции верхнего уровня.

Каждая команда COMMIT TRANSACTION работает только с последней начатой транзакцией. При завершении вложенной транзакции команда COMMIT применяется к наиболее «глу-бокой» вложенной транзакции. Даже если в команде COMMIT

Page 12: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

12

TRANSACTION указано имя транзакции более высокого уровня, будет завершена транзакция, начатая последней.

Если команда ROLLBACK TRANSACTION используется на любом уровне вложенности без указания имени транзакции, то откатываются все вложенные транзакции, включая транзак-цию самого высокого (верхнего) уровня. В команде ROLLBACK TRANSACTION разрешается указывать только имя самой верхней транзакции. Имена любых вложенных транзакций игнорируются, и попытка их указания приведет к ошибке. Таким образом, при от-кате транзакции любого уровня вложенности всегда происходит откат всех транзакций. Если же требуется откатить лишь часть транзакций, можно использовать команду SAVE TRANSACTION, с помощью которой создается точка сохранения.

Пример использования вложенных транзакций:BEGIN TRANSACTION

UPDATE R1 SET Баланс = Баланс – 100 WHERE [Номер счета]= ‘A123’BEGIN TRANSACTION

UPDATE R1 SET Баланс = Баланс + 100 WHERE [Номер счета]= ‘Б123’IF @@ROWCOUNT = 0

ROLLBACK TRANSACTIONELSEBEGIN

COMMIT TRANSACTIONCOMMIT TRANSACTION

ENDЗдесь в случае ошибки происходит возврат на начальное со-

стояние таблицы, поскольку выполнение команды ROLLBACK TRANSACTION без указания имени транзакции откатывает все транзакции.

Уровни изоляции MS SQL ServerУровень изоляции определяет степень независимости тран-

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

Page 13: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

13

SQL Server поддерживает все четыре уровня изоляции, опре-деленные стандартом ANSI. Уровень изоляции устанавливается командой:SET TRANSACTION ISOLATION LEVEL[READ UNCOMMITTED| READ COMMITTED | REPEATABLE READ| SERIALIZABLE ]

READ UNCOMMITED – незавершенное чтение, или допусти- UNCOMMITED – незавершенное чтение, или допусти-UNCOMMITED – незавершенное чтение, или допусти- – незавершенное чтение, или допусти-мо черновое чтение. Низший уровень изоляции, соответствующий уровню 0. Он гарантирует только физическую целостность дан-ных: если несколько пользователей одновременно изменяют одну и ту же строку, то в окончательном варианте строка будет иметь значение, определенное пользователем, последним изменившим запись. По сути, для транзакции не устанавливается никакой бло-кировки, которая гарантировала бы целостность данных.

READ COMMITTED – завершенное чтение, при котором от-сутствует черновое, «грязное» чтение. Тем не менее в процессе работы одной транзакции другая может быть успешно завершена и сделанные ею изменения зафиксированы. В итоге первая тран-закция будет работать с другим набором данных. Это проблема неповторяемого чтения.

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

SERIALIZABLE – сериализуемость. Чтение запрещено до за-вершения транзакции. Это максимальный уровень изоляции, ко-торый обеспечивает полную изоляцию транзакций друг от друга.

В каждый момент времени возможен только один уровень изоляции.

Функция @@NESTLEVEL возвращает уровень вложенно-сти транзакций.

Контрольные вопросы1. Что такое транзакция?2. Что такое блокировка?

Page 14: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

14

3. Какие виды определения транзакций поддерживает SQL Server?4. Какие команды используются для явного задания транзакций?5. Какие уровни изоляции поддерживает SQL Server?

2. Операторы процедурной логикиЯзык Transact-SQL отличается не только мощной поддерж-

кой транзакций, но и поддержкой переменных, благодаря кото-рым, становится возможным создание более сложных запросов и даже целых программ. Переменные есть и в других расширени-ях языка SQL (в том числе и PL/SQL), поэтому это не индивиду-альное преимущество именно MS SQL Server.

ПеременныеВсе используемые переменные должны быть поименованы.

В MS SQL Server необходимо придерживаться следующих пра-вил именования переменных: имя начинается со специального идентификатора (символа).

Типы идентификаторов:• @ – идентификатор локальной переменной (пользователь-

ской).• @@ – идентификатор глобальной переменной (часто их на-

зывают встроенными функциями).• # – идентификатор локальной таблицы или процедуры.• ## – идентификатор глобальной таблицы или процедуры.• [ ] – идентификатор группировки слов в переменную.

Для каждой переменной необходимо указать тип данных:• Число – для хранения числовых переменных (int, tinyint, small- – для хранения числовых переменных (int, tinyint, small-для хранения числовых переменных (int, tinyint, small- хранения числовых переменных (int, tinyint, small-хранения числовых переменных (int, tinyint, small- числовых переменных (int, tinyint, small-числовых переменных (int, tinyint, small- переменных (int, tinyint, small-переменных (int, tinyint, small- (int, tinyint, small-

int, bigint, numeric, decimal, money, smallmoney, float, real).• Дата – для хранения даты и времени (datetime,

smalldatetime,date,time).• Строка – для хранения символьных данных (char, nchar,

varchar, nvarchar).• Двоичные – для хранения бинарных данных (binary, varbinary, bit).

Page 15: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

15

• Специальные – указатели (cursor), 16-байтовое шестнадцати-ричное число, которое используется для GUID (uniqueidentifier), штамп изменения строки (timestamp), версия строки (rowversion), таблицы (table).Переменные объявляются в теле пакета или процедуры при

помощи инструкции DECLARE, а значения им присваиваются при помощи инструкций SET или SELECT. При помощи этой ин-струкции можно объявлять переменные курсоров для использо-вания в других инструкциях. После декларации все переменные инициализируются значением NULL, если иное значение не пре-доставляется как часть декларации.

Общий вид объявления переменной:DECLARE @имя тип [ = значение ] [,..n]

Изменение значения переменной: SET @имя = значение или SELECT @имя = значение

Пример использования переменных:USE R1DECLARE @balans moneySELECT @balans = Баланс FROM R1 WHERE [Номер счета]= ‘A123’SET @balans = @balans-100UPDATE R1 SET Баланс = @balans WHERE [Номер счета]= ‘A123’

Преобразование типовПреобразование типов данных происходит в следующих случаях:• При перемещении, сравнении или объединении данных

одного объекта с данными другого объекта эти данные могут преобразовываться из одного типа в другой.

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

Преобразование типов данных бывает явным и неявным. Неявное преобразование скрыто от пользователя. MS SQL

Server автоматически преобразует данные из одного типа в дру-

Page 16: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

16

гой. Например, если тип данных smallint сравнивается с типом int, то перед сравнением тип smallint неявно преобразуется в тип int.

Явное преобразование выполняется с помощью функций CAST и CONVERT.CAST ( выражение AS тип [ ( длина ) ] )CONVERT ( тип [ ( длина ) ] , выражение [ , стиль ] )или с версии MS SQL SERVER 2012TRY_CAST ( выражение AS тип [ ( длина ) ] )TRY_CONVERT ( тип [ ( длина ) ] , выражение [ , стиль ] )гдевыражение – любое допустимое выражение;тип – целевой тип данных;длина – указываемое дополнительно целое число, обозначающее длину целевого типа данных. Значение по умолчанию равно 30;стиль – целочисленное выражение, определяющее, как функция CONVERT преобразует параметр выражение. Если стиль имеет значение NULL, возвращается NULL. Диапазон определяется па-раметром тип.

Пример преобразования типов:SELECT * FROM R1 WHERE CAST(SUBSTRING([номер счета], 2, LEN([номер счета])-1) AS INT) LIKE ‘%123’ SELECT * FROM R1 WHERE CONVERT(INT , SUBSTRING([номер счета], 2, LEN([номер счета])-1) ) LIKE ‘%123’SELECT CASE WHEN TRY_CAST(‘тест’ AS float) IS NULL

THEN ‘Ошибка преобразования’ ELSE ‘OK’ END AS ResultSELECT CASE WHEN TRY_CONVERT(float, ‘тест’) IS NULL THEN ‘Ошибка преобразования’ ELSE ‘OK’ END AS Result

Page 17: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

17

Управляющие операторыВ Transact-SQL существуют специальные команды, которые

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

Оператор Описание

BEGIN...END

Определяет блок.BEGIN{оператор_SQL | блок _операторов}END

IF...ELSE

Условный оператор.IF логическое_выражение{оператор_SQL | блок _операторов}[ELSE [логическое_выражение]{оператор_SQL | блок _операторов}

RETURN

Безусловный выход.RETURN ([integer_expression])Возвращаемое значение – это код возврата, причем часть значений(-14 . . 0) зарезервирована под специ-альные состояния

WHILEЦикл с предусловием.WHILE логическое_выражение{оператор_SQL | блок _операторов}

BREAK Выход из цикла WHILE

CONTINUE Продолжение цикла WHILE

PRINT

Выдает заданное значение на экран.PRINT переменная | строкаДлина строки с сообщением не должна превышать255 символов

CASE

Простое выражение CASE для определения резуль-тата сравнивает выражение с набором простых вы-раженийCASE выражениеWHEN выражение1 THEN результат1[[WHEN выражение 2 THEN результат2[..n]][ELSE результатN]END

Page 18: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

18

CASE

Поисковое выражение CASE для определения ре-зультата вычисляет набор логических выражений.CASE

WHEN логическое_выражение THEN резуль� логическое_выражение THEN резуль�THEN резуль� резуль�тирующее_ выражение [ ...n ]

[ ELSE else_ результирующее_ выражение] END

TRY...CATCH

Реализация обработчика ошибок. Перехватывает все ошибки исполнения с кодом серьезности, боль-шим 10, которые не закрывают подключение к базе данных.BEGIN TRY

{ оператор_SQL | блок _операторов }END TRYBEGIN CATCH

[ { оператор_SQL | блок _операторов } ]END CATCH

RAISERROR

Создает сообщение об ошибке и запускает обработ-ку ошибок для сеанса. RAISERROR ( { номер_сообщения | строка_со� ( { номер_сообщения | строка_со�общения | @переменная } { ,степень_серьезности ,состояние } [ ,аргументы_подстановки [ ,...n ] ] ) [ WITH option [ ,...n ] ]номер_сообщения – Определяемый пользователем номер сообщения об ошибке, который хранится в представлении каталога sys.messages с помощью sp_addmessageстрока_сообщения – Определенное пользовате-лем сообщение с форматом, аналогичным формату функции printf из стандартной библиотеки языка Сстепень_серьезности – Степень серьезности от 0 до 18 может указать любой пользователь. Степени серьезности от 19 до 25 могут быть указаны только членами предопределенной роли сервера sysadmin и пользователями с разрешениями ALTER TRACE. Для степеней серьезности от 19 до 25 требуется па-раметр WITH LOG.Состояние – Целое число от 0 до 255. Отрицательные значения или значения больше 255 вызывают ошибку.

Page 19: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

19

WAITFOR

Блокирует выполнение пакета, хранимой процеду-ры или транзакции до наступления указанного вре-мени или интервала времениWAITFOR {

DELAY время_ожидания TIME время_завершения

}Пример использования управляющих конструкций для изме-

нения информации в таблицеWHILE (SELECT AVG(Баланс) FROM R1) > 30000BEGIN UPDATE R1 SET Баланс = Баланс – 100 IF (SELECT MAX(Баланс) FROM R1) < 50000 BREAK ELSE CONTINUEEND

Пример использования условного оператора для проверки существования объекта базы данныхIF NOT EXISTS (SELECT * FROM master.. sysdatabase WHERE Name = ‘MY_BASE ‘)BEGIN PRINT ‘База данных MY_BAS не существует, создаем’ CREATE DATABASE MY_BASEEND

КурсорыЗапрос к реляционной базе данных обычно возвращает не-

сколько рядов (записей) данных, но приложение за один раз об-рабатывает лишь одну запись. К сожалению, в Transact-SQL нет таких структур данных, как массивы, которые позволили бы об-рабатывать каждую строку отдельно. Такую построчную обра-ботку позволяют выполнить курсоры.

Курсор в SQL – это область в памяти базы данных, которая предназначена для хранения последнего оператора SQL.

В соответствии со стандартом SQL при работе с курсорами можно выделить следующие основные действия:

• создание или объявление курсора;

Page 20: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

20

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

• выборка из курсора и изменение с его помощью строк данных;

• закрытие курсора, после чего он становится недоступным для пользовательских программ;

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

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

SQL Server поддерживает курсоры статические, динамиче�ские, последовательные и управляемые набором ключей.

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

В статический курсор внести изменения невозможно, поэто-му он всегда открывается в режиме «только для чтения».

Page 21: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

21

Динамический курсор поддерживает данные в «живом» со-стоянии, но это требует затрат сетевых и программных ресурсов. При использовании динамических курсоров не создается полная копия исходных данных, а выполняется динамическая выборка из исходных таблиц только при обращении пользователя к тем или иным данным. На время выборки сервер блокирует стро-ки, а все изменения, вносимые пользователем в полный резуль-тирующий набор курсора, будут видны в курсоре. Однако если другой пользователь внес изменения уже после выборки данных курсором, то они не отразятся в курсоре.

Курсор, управляемый набором ключей, находится посередине между этими крайностями. Записи идентифицируются на момент выборки, и тем самым отслеживаются изменения. Такой тип курсора полезен при реализации прокрутки назад – тогда добавления и уда-ления рядов не видны, пока информация не обновится, а драйвер вы-бирает новую версию записи, если в нее были внесены изменения.

Создание курсора:DECLARE имя_курсора CURSOR [LOCAL | GLOBAL][FORWARD_ONLY | SCROLL][STATIC | KEYSET | DYNAMIC | FAST_FORWARD][READ_ONLY | SCROLL_LOCKS | OPTIMISTIC][TYPE_WARNING]FOR SELECT_оператор[FOR UPDATE [OF имя_столбца[,...n]]]При использовании ключевого слова LOCAL будет создан

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

Если указано ключевое слово GLOBAL, создается глобаль-ный курсор; он существует до закрытия текущего соединения.

При указании FORWARD_ONLY создается последователь-ный курсор; выборку данных можно осуществлять только в на-правлении от первой строки к последней.

Page 22: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

22

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

При указании STATIC создается статический курсор.При указании KEYSET создается ключевой курсор.При указании DYNAMIC создается динамический курсор.Если для курсора READ_ONLY указать аргумент FAST_

FORWARD, то созданный курсор будет оптимизирован для бы-строго доступа к данным. Этот аргумент не может быть использо-ван совместно с аргументами FORWARD_ONLY и OPTIMISTIC.

В курсоре, созданном с указанием аргумента OPTIMISTIC, запрещается изменение и удаление строк, которые были измене-ны после открытия курсора.

При указании аргумента TYPE_WARNING сервер будет ин-формировать пользователя о неявном изменении типа курсора, если он несовместим с запросом SELECT.

Открытие курсораДля открытия курсора и наполнения его данными из указан-

ного при создании курсора запроса SELECT используется сле-дующая команда:

OPEN {{[GLOBAL] имя_курсора } |@имя_переменной_курсора}После открытия курсора происходит выполнение связанного

с ним оператора SELECT, выходные данные которого сохраня-ются в многоуровневой памяти.

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

мое (результат выполнения соответствующего запроса) посред-ством следующей команды:

FETCH [[NEXT | PRIOR | FIRST | LAST| ABSOLUTE {номер_строки | @переменная_номера_строки}| RELATIVE {номер_строки | @переменная_номера_строки}]FROM ]{{[GLOBAL ]имя_курсора }| @имя_переменной_курсора }[INTO @имя_переменной [,...n]]При указании FIRST будет возвращена самая первая строка

полного результирующего набора курсора, которая становится текущей строкой.

При указании LAST возвращается самая последняя строка курсора. Она же становится текущей строкой.

Page 23: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

23

При указании NEXT возвращается строка, находящаяся в полном результирующем наборе сразу же после текущей. Те-перь она становится текущей. По умолчанию команда FETCH ис-пользует именно этот способ выборки строк.

Ключевое слово PRIOR возвращает строку, находящуюся перед текущей. Она и становится текущей.

Аргумент ABSOLUTE {номер_строки | @переменная_номе-ра_строки} возвращает строку по ее абсолютному порядковому номеру в полном результирующем наборе курсора. Номер стро-ки можно задать с помощью константы или как имя переменной, в которой хранится номер строки. Переменная должна иметь це-лочисленный тип данных. Указываются как положительные, так и отрицательные значения. При указании положительного зна-чения строка отсчитывается от начала набора, отрицательного – от конца. Выбранная строка становится текущей. Если указано нулевое значение, строка не возвращается.

Аргумент RELATIVE {кол_строки | @переменная_кол_строки} возвращает строку, находящуюся через указанное количество строк после текущей. Если указать отрицательное значение числа строк, то будет возвращена строка, находящаяся за указанное количество строк перед текущей. При указании нулевого значения возвратится текущая строка. Возвращенная строка становится текущей.

В конструкции INTO @имя_переменной [,...n] задается список переменных, в которых будут сохранены соответствующие значе-ния столбцов возвращаемой строки. Порядок указания переменных должен соответствовать порядку столбцов в курсоре, а тип данных переменной – типу данных в столбце курсора. Если конструкция INTO не указана, то поведение команды FETCH будет напоминать поведение команды SELECT – данные выводятся на экран.

Изменение и удаление данныхДля выполнения изменений с помощью курсора необходимо

выполнить команду UPDATE в следующем формате:UPDATE имя_таблицы SET {имя_столбца={DEFAULT | NULL | выражение}}[,...n]WHERE CURRENT OF {{[GLOBAL] имя_курсора}|@имя_переменной_курсора}

Page 24: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

24

За одну операцию могут быть изменены несколько столбцов теку-щей строки курсора, но все они должны принадлежать одной таблице.

Для удаления данных посредством курсора используется ко-манда DELETE в следующем формате:

DELETE имя_таблицыWHERE CURRENT OF {{[GLOBAL] имя_курсора}|@имя_переменной_курсора}В результате будет удалена строка, установленная текущей

в курсоре.Закрытие курсораCLOSE {имя_курсора | @имя_переменной_курсора}После закрытия курсор становится недоступным для поль-

зователей программы. При закрытии снимаются все блокировки, установленные в процессе его работы. Закрытие может приме-няться только к открытым курсорам. Закрытый, но неосвобож-денный курсор может быть повторно открыт. Не допускается за-крывать неоткрытый курсор.

Освобождение курсораЗакрытие курсора необязательно освобождает ассоциирован-

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

DEALLOCATE { имя_курсора | @имя_переменной_курсора }Для контроля достижения конца курсора рекомендуется при-

менять функцию: @@FETCH_STATUSФункция @@FETCH_STATUS возвращает: 0, если выборка завершилась успешно;-1, если выборка завершилась неудачно вследствие попытки

выборки строки, находящейся за пределами курсора;-2, если выборка завершилась неудачно вследствие попытки

обращения к удаленной или измененной строке.Пример объявления и открытия курсора:

--объявление курсораDECLARE My_Curcor CURSOR SCROLL FOR SELECT * FROM R1-- использование переменной для объявления курсора

Page 25: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

25

DECLARE @MyCursor CURSORSET @MyCursor=CURSOR LOCAL SCROLL FOR

SELECT * FROM Клиент-- открытие курсораOPEN My_Curcor

Пример использования курсора для вывода номеров счетов с балансом выше среднего.DECLARE @nomer varchar(50),

@balans money,@avg_balans money,@message varchar(250)

SELECT @avg_balans = avg(Баланс) FROM R1PRINT ‘ Список счетов’DECLARE klient_cursor CURSOR LOCAL FORSELECT * FROM R1 WHERE Баланс > @avg_balans ORDER BY БалансOPEN klient_cursorFETCH NEXT FROM klient_cursor INTO @nomer , @balans WHILE @@FETCH_STATUS=0BEGIN

SELECT @message=’Счет’+@nomer +’Баланс ‘+CAST(@balans as varchar)

PRINT @message-- переход к следующему клиенту

FETCH NEXT FROM klient_cursor INTO @nomer , @balans ENDCLOSE klient_cursorDEALLOCATE klient_cursor

3. Хранимые процедурыХранимые процедуры (Stored procedure) представляют собой на-

бор команд, состоящий из одного или нескольких операторов SQL или функций и сохраняемый в базе данных в откомпилированном виде. Выполнение в базе данных хранимых процедур вместо отдель-ных операторов SQL дает пользователю следующие преимущества:

Page 26: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

26

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

чем последовательность отдельных операторов, так как все они прошли этап синтаксического анализа и находятся в исполняе-мом формате; перед выполнением хранимой процедуры SQL Server генерирует для нее план исполнения, выполняет ее опти-мизацию и компиляцию;

• хранимые процедуры поддерживают модульное програм-мирование, так как позволяют разбивать большие задачи на само-стоятельные, более мелкие и удобные в управлении части;

• хранимые процедуры могут вызывать другие хранимые процедуры и функции и могут быть вызваны из прикладных про-грамм других типов;

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

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

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

Page 27: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

27

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

В SQL Server поддерживается несколько типов хранимых процедур.

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

Пользовательские хранимые процедуры реализуют те или иные действия. Хранимые процедуры – полноценный объект базы данных. Вследствие этого каждая хранимая процедура рас-полагается в конкретной базе данных, где и выполняется.

Временные хранимые процедуры существуют лишь некоторое время, после чего автоматически уничтожаются сервером. Они де-лятся на локальные и глобальные. Локальные временные хранимые процедуры могут быть вызваны только из того соединения, в котором созданы. При создании такой процедуры ей необходимо дать имя, на-чинающееся с одного символа #. Как и все временные объекты, хра-нимые процедуры этого типа автоматически удаляются при отклю-чении пользователя, перезапуске или остановке сервера. Глобальные временные хранимые процедуры доступны для любых соединений сервера, на котором имеется такая же процедура. Для ее определения достаточно дать ей имя, начинающееся с символов ##. Удаляются эти процедуры при перезапуске или остановке сервера, а также при за-крытии соединения, в контексте которого они были созданы.

Page 28: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

28

Создание новой и изменение имеющейся хранимой процеду-ры осуществляется с помощью следующей команды:{CREATE | ALTER } PROCEDURE имя_процедуры [; номер][{@имя_параметра тип_данных } [VARYING ] [=default] [OUTPUT] [READONLY] ] [,...n][WITH { RECOMPILE | ENCRYPTION | RECOMPILE,ENCRYPTION }][FOR REPLICATION] [ EXECUTE AS Clause ]AS тело_процедуры

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

Номер – необязательный целочисленный аргумент, исполь-зуемый для группирования одноименных процедур. Все сгруп-пированные процедуры можно удалить, выполнив одну инструк-цию DROP PROCEDURE.

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

Для определения типа данных, который будет иметь соответ-ствующий параметр хранимой процедуры, можно использовать любые типы данных SQL, включая определенные пользователем. Однако тип данных CURSOR может быть использован только как выходной параметр хранимой процедуры, т. е. с указанием ключевого слова OUTPUT.

Page 29: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

29

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

Ключевое слово VARYING применяется совместно с пара-метром OUTPUT, имеющим тип CURSOR. Оно определяет, что выходным параметром будет результирующее множество.

Ключевое слово DEFAULT представляет собой значение, ко-торое будет принимать соответствующий параметр по умолчанию.

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

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

Параметр FOR REPLICATION востребован при репликации данных и включении создаваемой хранимой процедуры в каче-стве статьи в публикацию.

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

Ключевое слово EXECUTE AS определяет контекст безопас-ности, в котором должна быть выполнена процедура.

Ключевое слово AS размещается в начале собственно тела хранимой процедуры, т. е. набора команд SQL, с помощью кото-рых и будет реализовываться то или иное действие. В теле про-цедуры могут применяться практически все команды SQL, объ-

Page 30: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

30

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

Удаление хранимой процедуры осуществляется командой:DROP PROCEDURE {имя_процедуры} [,...n]Для выполнения хранимой процедуры используется команда:[[ EXEC [ UTE] [@return_status=] имя_процедуры [;номер][[@имя_параметра=]{значение | @имя_переменной} [OUTPUT ]|[DEFAULT ]][,...n]Если вызов хранимой процедуры не является единственной

командой в пакете, то присутствие команды EXECUTE обяза-тельно. Более того, эта команда требуется для вызова процедуры из тела другой процедуры или триггера. Использование ключево-го слова OUTPUT при вызове процедуры разрешается только для параметров, которые были объявлены при создании процедуры с ключевым словом OUTPUT.

Когда же при вызове процедуры для параметра указывает-ся ключевое слово DEFAULT, то будет использовано значение по умолчанию. Естественно, указанное слово DEFAULT разре-шается только для тех параметров, для которых определено зна-чение по умолчанию.

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

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

Пример процедуры без параметров, возвращающей набор данных.

Page 31: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

31

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

CREATE PROC my_proc1ASSELECT * FROM R1 WHERE Баланс< (SELECT AVG(Баланс) FROM R1)

Для обращения к процедуре можно использовать команды:EXEC my_proc1 или my_proc1Пример процедуры с входным параметром, возвращающей

набор данных. Разработать процедуру для получения номеров счетов с ба-

лансом более введенного.CREATE PROC my_proc2 @par1 money =1000ASSELECT * FROM R1 WHERE Баланс>@par1Для обращения к процедуре можно использовать команды:EXEC my_proc2 7000 EXEC my_proc2 @par1=7000 my_proc2 -- будет использоваться значение по умолчаниюПример процедуры с входным и выходным параметром. Разработать процедуру для получения количества счетов

с балансом более введенного.CREATE PROC my_proc3 @par1 money =1000, @count INT

OUTPUTASSELECT @count =count([номер счета]) FROM R1 WHERE Баланс>@par1Для обращения к процедуре можно использовать команды:DECLARE @count_nomber int, @balans moneySET @balans = 7000EXEC my_proc3 @balans , @count_nomber OUTPUTSELECT @count_nomber AS ’количество счетов’

EXEC my_proc3 @count_nomber OUTPUT

Page 32: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

32

-- будет использоваться значение по умолчанию для первого параметра

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

с балансом более среднего.CREATE PROC my_proc4ASBEGIN

DECLARE @m moneySELECT @m=AVG(Баланс) FROM R1RETURN @m

ENDCREATE PROC my_proc5 @count_nomber INT OUTPUTASBEGIN

DECLARE @p moneyEXEC @p = my_proc4EXEC my_proc3 @p , @count_nomber OUTPUT

END Получение информации о хранимых процедурахС помощью системной процедуры sp_help можно получить

отчет о сохраненной процедуре. Например, пользователь мо-жет получить информацию о сохраненной процедуре my_ proc1 из созданной базы данных с помощью следующей команды:

sp_help my_ proc1Чтобы увидеть текст (тело) сохраненной процедуры, нужно

вызвать системную процедуру sp_helptext:sp_helptext my_ proc1

Контрольные вопросы1. Что такое хранимая процедура?2. Где выполняются хранимые процедуры?3. Как активизируются хранимые процедуры?4. В чем преимущества использования хранимых процедур?5. Какие типы хранимых процедур имеются в MS SQL Server?

Page 33: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

33

4. Пользовательские функцииОдним из недостатков хранимых процедур является невоз-

можность их использования непосредственно в выражениях, т. к. они требуют промежуточного присвоения возвращенного зна-чения переменной, которая затем и указывается в выражении. Естественно, подобный метод применения программного кода не слишком удобен. Многие разработчики уже давно хотели иметь возможность вызова разработанных алгоритмов непосред-ственно в выражениях. Возможность создания пользовательских функций была предоставлена в среде MS SQL Server 2000.

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

В SQL Server имеются следующие классы функций пользо-вателя:

Scalar – функции возвращают обычное скалярное значе-ние, каждая может включать множество команд, объединяемых в один блок с помощью конструкции BEGIN...END. Такие функ-ции могут возвращать любые типы данных, кроме text, ntext, image, cursor и timestamp;

Inline – функции содержат всего одну команду SELECT и возвращают пользователю набор данных в виде значения типа данных TABLE;

Multi�statement – функции также возвращают пользователю значение типа данных TABLE, содержащее набор данных, одна-ко в теле функции находится множество команд SQL (INSERT, UPDATE и т. д.). Именно с их помощью и формируется набор данных, который должен быть возвращен после выполнения функции.

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

Page 34: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

34

В функциях допустимы следующие инструкции.• Инструкции присваивания.• Инструкции управления потоком, за исключением

инструкций TRY...CATCH.• Инструкции DECLARE, объявляющие локальные

переменные и локальные курсоры.• Инструкции SELECT, которые содержат списки выбора

с выражениями, присваивающими значения локальным переменным.

• Операции над локальными курсорами, которые объявляются, открываются, закрываются и освобождаются в теле функции. Допустимы только те инструкции FETCH, которые предложением INTO присваивают значения локальным переменным. Инструкции FETCH, возвращающие данные клиенту, недопустимы.

• Инструкции INSERT, UPDATE и DELETE, которые изменяют локальные табличные переменные.

• Инструкции EXECUTE, вызывающие расширенные хранимые процедуры.

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

CREATE FUNCTION [ имя_схемы. ] имя _функции ( [ { @имя_параметра [ AS ][ имя_схемы. ] тип_данных [ = default ] [ READONLY ] } [ ,...n ] ])RETURNS тип_данных[ WITH {ENCRYPTION | SCHEMABINDING | EXECUTE AS … } ,[…n] ][ AS ]BEGIN тело_функции

RETURN скалярное_выражениеEND

Page 35: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

35

Рассмотрим назначение параметров команды.Функция может содержать один или несколько входных па-

раметров либо не содержать ни одного. Каждый параметр дол-жен иметь уникальное в пределах создаваемой функции имя и начинаться с символа «@». После имени указывается тип дан-ных параметра. Дополнительно можно указать значение, которое будет автоматически присваиваться параметру (DEFAULT), если пользователь явно не указал значение соответствующего параме-тра при вызове функции.

С помощью конструкции RETURNS указывается, какой тип данных будет иметь возвращаемое функцией значение.

Дополнительные параметры, с которыми должна быть соз-дана функция, могут быть указаны посредством ключевого слова WITH. Благодаря ключевому слову ENCRYPTION код команды, используемый для создания функции, будет зашифрован, и никто не сможет просмотреть его. Эта возможность позволяет скрыть логику работы функции. Кроме того, в теле функции может вы-полняться обращение к различным объектам базы данных, а по-тому изменение или удаление соответствующих объектов может привести к нарушению работы функции. Чтобы избежать этого, требуется запретить внесение изменений, указав при создании этой функции ключевое слово SCHEMABINDING.

Между ключевыми словами BEGIN...END указывается на-бор команд, они и будут являться телом функции.

Когда в ходе выполнения кода функции встречается клю-чевое слово RETURN, выполнение функции завершается и как результат ее вычисления возвращается значение, указанное не-посредственно после слова RETURN. Отметим, что в теле функ-ции разрешается использование множества команд RETURN, которые могут возвращать различные значения. В качестве воз-вращаемого значения допускаются как обычные константы, так и сложные выражения. Единственное условие – тип данных воз-вращаемого значения должен совпадать с типом данных, указан-ным после ключевого слова RETURNS.

Пример скалярной функции

Page 36: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

36

Пусть имеется таблица, в которой фиксируются все провод-ки по счетам.R2([Номер счета], Сумма, [Дата проведения])

Если Сумма больше 0, то деньги поступают на счет, если меньше 0, то снимаются со счета.

Создать и применить функцию скалярного типа для вычис-ления суммарной прибыли за последние 30 календарных дней на указанном счете.

CREATE FUNCTION sales ( @number VARCHAR(50) )RETURNS MONEYASBEGINDECLARE @prihod MONEYIF NOT EXISTS (SELECT * FROM R2

WHERE [Дата проведения]=@number AND ABS(DATEDIFF(DAY,GETDATE(),[Дата проведения]))<30)

SET @prihod=0ELSE

SELECT @prihod=sum(Сумма) FROM R2 WHERE [Дата проведения]=@number

AND ABS(DATEDIFF(DAY,GETDATE(),[Дата проведе-Дата проведе- проведе-проведе-ния]))<30

RETURN @prihodENDGO -- обращение к функцииPRINT ‘Прибыль =’+CAST(Test.dbo.sales(‘a123’) as varchar)

Inline функции Создание функции этого типа выполняется с помощью ко-

манды:CREATE FUNCTION [ имя_схемы. ] имя _функции ( [ { @имя_параметра [ AS ][ имя_схемы. ] тип_данных [ = default ] [ READONLY ] } [ ,...n ] ])

Page 37: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

37

RETURNS TABLE [ WITH {ENCRYPTION | SCHEMABINDING | EXECUTE AS … } ,[…n] ] [ AS ] RETURN [(] SELECT_оператор [)]

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

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

Возвращаемое функцией значение типа TABLE может быть использовано непосредственно в запросе, т. е. в разделе FROM.

Пример inline функцииСоздать и применить функцию табличного типа для определе-

ния номеров счетов с наименьшей прибылью за последние K дней. Используется общетабличное представление.

CREATE FUNCTION sales1( @k int =30)RETURNS TABLEASRETURN WITH pr1([номер счета],summa)

AS (SELECT [номер счета], sum(сумма) as summa FROM R2 WHEREABS(DATEDIFF(DAY,GETDATE(),[Дата проведения]))<@kGROUP BY [номер счета] ),

pr2(min_sum)AS (SELECT MIN(summa) as min_sum FROM pr1)

SELECT [номер счета] FROM pr1 ,pr2 where summa = pr2.min_sumGO

Page 38: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

38

-- обращение к функцииSELECT * FROM Test.dbo.sales1(25)

Multi-statement функции Создание функций типа Multi-statement выполняется с помо-

щью следующей команды:CREATE FUNCTION [ имя_схемы. ] имя _функции ( [ { @имя_параметра [ AS ][ имя_схемы. ] тип_данных [ = default ] [ READONLY ] } [ ,...n ] ])RETURNS @имя_параметра TABLE определение_таблицы [ WITH {ENCRYPTION | SCHEMABINDING | EXECUTE AS … } ,[…n] ][ AS ]BEGIN тело_функции RETURNEND

Использование большей части параметров рассматривалось при описании предыдущих функций.

В отличие от табличных функций, при создании функций Multi-statement необходимо явно задать структуру возвращаемо-го значения. Она указывается непосредственно после ключево-го слова TABLE и, таким образом, является частью определения возвращаемого типа данных. Синтаксис конструкции определе-ние_таблицы полностью соответствует одноименным структу-рам, используемым при создании обычных таблиц с помощью команды CREATE TABLE.

Набор возвращаемых данных должен формироваться с помо-щью команд INSERT, выполняемых в теле функции. Кроме того, в теле функции допускается использование различных конструк-ций языка SQL, которые могут контролировать значения, разме-щаемые в выходном наборе строк. При работе с командой INSERT требуется явно указать имя того объекта, куда необходимо вставить строки. Поэтому в функциях типа Multi-statement, в отличие от та-бличных, необходимо присвоить какое-то имя объекту с типом дан-ных TABLE – оно и указывается как возвращаемое значение.

Page 39: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

39

Завершение работы функции происходит в двух случаях: если возникают ошибки выполнения и если появляется ключе-вое слово RETURN. В отличие от функций скалярного типа, при использовании команды RETURN не нужно указывать возвра-щаемое значение. Сервер автоматически возвратит набор дан-ных типа TABLE, имя и структура которого была указана после ключевого слова RETURNS. В теле функции может быть указано более одной команды RETURN.

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

Пример multi-statement функцииСоздать и применить функцию (типа multi-statement), кото-

рая для номеров счетов с наименьшей прибылью за последние K дней выдает информацию о балансе счета. CREATE FUNCTION sales2 (@k int =30)RETURNS @my_table TABLE

([номер счета] VARCHAR(50),баланс MONEY)ASBEGIN

INSERT INTO @my_tableSELECT * FROM R1 WHERE [номер счета] IN (SELECT* FROM Test.dbo.sales3( @k ) )

RETURNENDGO -- обращение к функцииSELECT * FROM Test.dbo.sales2()

Удаление любой функции осуществляется командой:DROP FUNCTION {[ владелец.] имя_функции } [,...n]

Встроенные функцииВстроенные функции, имеющиеся в распоряжении пользователей

при работе с SQL, можно условно разделить на следующие группы:• математические функции;

Page 40: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

40

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

Математические функцииКраткий обзор математических функций представлен в таблице.

Функция Синтаксис Возвращаемое значение

ABS ABS ( numeric_expression )

Вычисляет абсолютное зна-чение числа

ACOS ACOS ( float_expression ) Вычисляет арккосинусASIN ASIN ( float_expression ) Вычисляет арксинусATAN ATAN ( float_expression ) Вычисляет арктангенс

ATN2ATN2 ( float_expression , float_expression )

Возвращает угол в радианах между положительным направ-лением оси X и лучом, прове-денным из начала координат в точку (y, x), где x и y — зна-чения двух указанных выраже-ний с плавающей запятой.

CEILING CEILING ( numeric_expression )

Возвращает наименьшее це-лое число, которое больше или равно данному числово-му выражению.

COS COS ( float_expression ) Вычисляет косинус углаCOT COT ( float_expression ) Возвращает котангенс угла

DEGREES DEGREES (numeric_expression )

Преобразует значение угла из радиан в градусы

EXP EXP ( float_expression ) Возвращает экспоненту

FLOOR FLOOR ( numeric_expression ) Выполняет округление вниз

LOG LOG ( float_expression ) Вычисляет натуральный ло-гарифм

LOG10 LOG10 ( float_expression )

Вычисляет десятичный лога-рифм

PI PI ( ) Возвращает значение «пи»

POWER POWER ( float_expression , y ) Возводит число в степень

Page 41: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

41

RADIANS RADIANS ( numeric_expression )

Преобразует значение угла из градуса в радианы

RAND RAND ( [ seed ] ) Возвращает случайное число

ROUNDROUND ( numeric_expression , length [ ,function ] )

Выполняет округление с за-данной точностью

SIGNSIGN ( numeric_expression )

Возвращает положительное (+1), нулевое (0) или отри-цательное (-1) значение, обо-значающее знак заданного выражения.

SIN SIN ( float_expression ) Вычисляет синус угла

SQUARE SQUARE ( float_expression )

Выполняет возведение числа в квадрат

SQRT SQRT ( float_expression ) Извлекает квадратный корень

TAN TAN ( float_expression ) Возвращает тангенс угла

Пример применения функции POWER .DECLARE @value int, @counter int;SET @value = 2;SET @counter = 1;

WHILE @counter < 5 BEGIN SELECT POWER(@value, @counter) SET NOCOUNT ON SET @counter = @counter + 1 SET NOCOUNT OFF END;

Пример получения различных случайных числа, сформиро-ванных функцией RAND.DECLARE @counter smallint;SET @counter = 1;WHILE @counter < 5 BEGIN SELECT RAND() Random_Number

Page 42: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

42

SET @counter = @counter + 1 END;GO

Cтроковые функцииКраткий обзор строковых функций представлен в таблице.Функция Синтаксис Возвращаемое значение

ASCII ASCII ( character_expression )

Возвращает код ASCII первого символа указан-ного символьного выра-жения.

CHAR CHAR ( integer_expression )

По коду ASCII возвра-щает символ

CHARINDEXCHARINDEX ( expression1 ,expression2 [ , start_location ] )

Определяет порядковый номер символа, с кото-рого начинается вхожде-ние подстроки в строку

DIFFERENCEDIFFERENCE ( character_expression , character_expression )

Возвращает показатель совпадения строк

LEFTLEFT ( character_expression , integer_expression )

Возвращает указанное число символов с начала строки

LEN LEN ( string_expression ) Возвращает длину строки

LOWER LOWER ( character_expression )

Переводит все символы строки в нижний регистр

LTRIM LTRIM ( character_expression )

Удаляет пробелы в нача-ле строки

NCHAR NCHAR ( integer_expression )

Возвращает по коду символ Unicode

PATINDEX PATINDEX ( ‘%pattern%’, expression )

Выполняет поиск под-строки в строке по ука-занному шаблону

REPLACE

REPLACE ( string_expression1 , string_expression2 , string_expression3 )

Заменяет вхождения под-строки на указанное зна-чение. Заменяет в строке1 все вхождения строки2 на строку3.

REPLICATEREPLICATE ( string_expression ,integer_expression )

Выполняет тиражирова-ние строки определен-ное число раз

Page 43: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

43

REVERSE REVERSE ( character_expression )

Возвращает строку, сим-волы которой записаны в обратном порядке

RIGHTRIGHT ( character_expression , integer_expression )

Возвращает указанное число символов с конца строки

RTRIM RTRIM ( character_expression )

Удаляет пробелы в кон-це строки

SOUNDEX SOUNDEX ( character_expression )

Возвращает код звуча-ния строки

SPACE SPACE ( integer_expression )

Возвращает указанное число пробелов

STR STR ( float_expression [ , length [ , decimal ] ] )

Выполняет конвертиро-вание значения число-вого типа в символьный формат

STUFFSTUFF ( character_expression , start , length, character_expression )

Удаляет указанное чис-ло символов, заменяя новой подстрокой

SUBSTRING SUBSTRING ( expression ,start , length )

Возвращает для строки подстроку указанной дли-ны с заданного символа

UNICODE UNICODE ( ‘ncharacter_expression’ )

Возвращает Unicode-код левого символа строки

UPPER UPPER ( character_expression )

Переводит все символы строки в верхний ре-гистр

SELECT Фирма, [Фамилия]+» «+Left([Имя],1)+».»+Left([Отчество],1FROM Клиент

Использование функции LEFT для получения инициалов клиентов.

Page 44: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

44

Функции для работы с датой и временемКраткий обзор основных функций для работы с датой и вре-

менем представлен в таблице.Функция Синтаксис Возвращаемое значение

DATEADDDATEADD ( datepart , number, date )

Добавляет к дате указанное зна-чение дней, месяцев, часов и т. д.

DATEDIFFDATEDIFF ( datepart , start-date , enddate )

Возвращает разницу между ука-занными частями двух дат

DATENAME DATENAME ( datepart , date )

Выделяет из даты указанную часть и возвращает ее в символь-ном формате

DATEPART DATEPART ( datepart , date )

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

DAY DAY( date ) Возвращает число из указанной даты

GETDATE GETDATE() Возвращает текущее системное время

ISDATE ISDATE ( date )Проверяет правильность выра-жения на соответствие одному из возможных форматов ввода даты

MONTH MONTH ( date ) Возвращает значение месяца из указанной даты

YEAR YEAR ( date ) Возвращает значение года из ука-занной даты

Datepart Допустимые сокращенияYear – год yy, yyyyQuarter – квартал qq, qMonth – месяц mm, mDayofyear – день года dy, yDay – день dd, dWeek – неделя wk, wwHour – час hhMinute – минута mi, nSecond – секунда ss, sMillisecond – миллисекунда ms

Page 45: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

45

Пример использование функций YEAR, MONTH и DATEDIFF

Средства, накопленные за последние 30 дней.SELECT Year([Дата проведения])) AS Год, Month([Дата проведения])) AS Месяц, Sum(Сумма) AS ИтогFROM R2WHERE ABS( Datediff(d, ([Дата проведения],Getdate()) )<30GROUP BY Year([Дата проведения])), Month([Дата проведения]))

Контрольные вопросы1. Какие виды функций используются в MS SQL SERVER?2. Какие имена используются для написания системных

функций?3. Можно ли использовать функции в командах SQL?4. Какие значения могут возвращать функции?

5. Триггеры DMLТриггеры DML – это хранимые процедуры особого типа, ав-

томатически вступающие в силу, если происходит событие языка обработки данных DML, которое затрагивает таблицу или пред-ставление, определенное в триггере. События DML включают ин-струкции INSERT, UPDATE или DELETE. Триггеры DML могут использоваться для предписания бизнес-правил и правил целост-ности данных, выполнения запросов к другим таблицам и вклю-чения сложных инструкций Transact-SQL. Триггер и инструкция, при выполнении которой он срабатывает, считаются одной тран-закцией, которую можно откатить назад внутри триггера.

Триггеры DML аналогичны ограничениям в том, что могут предписывать целостность сущностей или целостность домена. Вообще говоря, целостность сущностей должна всегда задавать-ся на самом нижнем уровне с помощью индексов, являющихся частью ограничений PRIMARY KEY и UNIQUE или создаваемых независимо от ограничений. Целостность домена должна быть предписана через ограничения CHECK, а ссылочная целостность

Page 46: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

46

– через ограничения FOREIGN KEY. Триггеры DML наиболее полезны в тех случаях, когда функции ограничений не удовлет-воряют функциональным потребностям приложения.

В следующем списке приведено сравнение триггеров DML с ограничениями и указано, в чем триггеры DML имеют преиму-щества.

- Триггеры DML позволяют каскадно проводить изменения через связанные таблицы в базе данных; но эти изменения могут осуществляться более эффективно с использованием каскадных ограничений ссылочной целостности. Ограничения FOREIGN KEY могут проверить значения столбца только на предмет точ-ного совпадения со значениями другого столбца.

- Для предотвращения случайных или неверных операций INSERT, UPDATE и DELETE и реализации других более слож-ных ограничений, чем те, которые определены при помощи ограничения CHECK. В отличие от ограничений CHECK, DML-триггеры могут ссылаться на столбцы других таблиц. Например, триггер может использовать инструкцию SELECT для сравнения вставленных или обновленных данных и выполнения других дей-ствий, например изменения данных или отображения пользова-тельского сообщения об ошибке.

- Чтобы оценить состояние таблицы до и после изменения данных и предпринять действия на основе этого различия.

- Несколько DML-триггеров одинакового типа (INSERT, UPDATE или DELETE) для таблицы позволяют предпринять не-сколько различных действий в ответ на одну инструкцию изме-нения данных.

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

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

Page 47: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

47

значение не соответствует первичному ключу. Обычно в указан-ных случаях используются ограничения FOREIGN KEY.

- Если в таблице существуют ограничения, то их провер-ка осуществляется между выполнением триггеров INSTEAD OF и AFTER. В случае нарушения ограничений выполняется откат действий триггеров INSTEAD OF, а триггер AFTER не срабатывает.

Основной формат команды создания триггера

CREATE TRIGGER [имя_триггера]ON имя_таблицы{ FOR | AFTER | INSTEAD OF} {[INSERT] [,] [UPDATE] [,][ DELETE]}[WITH ENCRYPTION]AS SQL_операторы

используя предложение IF UPDATE

CREATE TRIGGER [имя_триггера]ON имя_таблицы{ FOR | AFTER | INSTEAD OF} {[INSERT] [,] [UPDATE] } [WITH ENCRYPTION]ASIF UPDATE (имя_столбца) [{AND | OR} UPDATE (имя_столб-ца)...]| IF (COLUMNS_UPDATES(){оператор_бит_обработки} бит_ма-ска_изменения){оператор_бит_сравнения } бит_маска [...n]}sql_оператор [...n]}SQL_операторы

ON имя_таблицы – объявляется таблица или представление, от которых зависит триггер.WITH ENCRYPTION имеет тот же смысл, что и для хранимых процедур.{ FOR | AFTER | INSTEAD OF} – указывает, когда должен запускать-ся триггер. Ключевые слова FOR и AFTER являются синонимами.

Page 48: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

48

IF UPDATE (имя_столбца) [{AND | OR} UPDATE (имя_столбца)...] – позволяет выбрать конкретный столбец, запускающий триггер. COLUMNS_UPDATES – возвращает битовый шаблон varbinary, который показывает, какие столбцы таблицы или представления добавлялись или изменялись.

В большинстве СУБД действуют следующие ограничения:-Нельзя использовать в теле триггера операции создания объ-

ектов базы данных (новой базы данных, новой таблицы, новой хранимой процедуры, нового триггера, новых представлений).

-Нельзя использовать в триггере команду удаления объек-тов DROP для всех типов базовых объектов базы данных.

-Нельзя использовать в теле триггера команды изменения базовых объектов ALTER TABLE, ALTER DATABASE.

-Нельзя изменять права доступа к объектам базы данных, т. е. выполнять команду GRAND или REVOKE.

-Нельзя создать триггер для представления (VIEW) .-В отличие от хранимых процедур триггер не может возвра-

щать никаких значений, он запускается автоматически сервером и не может связаться самостоятельно ни с одним клиентом.

-Внутри триггера не допускается выполнение восстановле-ния резервной копии БД или журнала транзакций.

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

Триггер FOR (AFTER)Триггеры FOR(AFTER) выполняются после выполнения дей-FOR(AFTER) выполняются после выполнения дей-(AFTER) выполняются после выполнения дей-AFTER) выполняются после выполнения дей-) выполняются после выполнения дей-

ствий инструкции INSERT, UPDATE или DELETE. Триггеры FOR(AFTER) никогда не выполняются, если происходит нарушение ограничения, поэтому эти триггеры нельзя использовать для какой-либо обработки, которая могла бы предотвратить нарушение ограни-чения. Если в результате работы триггера была обнаружена ошибка, то необходимо выполнить откат транзакции с помощью команды ROLLBACK TRANSACTION для отмены действия инструкции, если ошибок нет, то никаких дополнительных действий не нужно.

Page 49: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

49

Триггер INSTEAD OFТриггеры INSTEAD OF переопределяют стандартные дей-

ствия инструкции, вызывающей триггер. Поэтому они могут использоваться для проверки на наличие ошибок или проверки значений на одном или нескольких столбцах и выполнения до-полнительных действий перед вставкой, обновлением или удале-нием одной или нескольких строк. Например, если обновляемое значение в столбце почасовой оплаты в таблице учетной ведомо-сти начинает превышать определенное значение, то с помощью этого триггера можно либо задать вывод сообщения об ошибке и откатить транзакцию, либо сделать вставку новой записи в след аудита до вставки записи в таблицу учетной ведомости. Главное преимущество триггеров INSTEAD OF в том, что они позволя-ют поддерживать обновления для таких представлений, которые обновлять невозможно. Например, в представлении, основанном на нескольких базовых таблицах, должен использоваться триг-гер INSTEAD OF для поддержки операций вставки, обновления и удаления, которые ссылаются на данные больше чем в одной таблице. Другое преимущество триггера INSTEAD OF состо-ит в том, что он обеспечивает логику кода, при которой можно отвергать одни части пакета и принимать другие. Если триггер INSTEAD OF отработал успешно, необходимо продублировать инструкцию, вызвавшую триггер, так как данные не попали в та-блицу, если возникла ошибка, никаких действий не требуется.

Функциональность триггеров AFTER и INSTEAD OF срав-нивается в следующей таблице.

Функция Триггер AFTER Триггер INSTEAD OFСущности, к кото-рым применяется триггер

Таблицы Таблицы и пред-ставления

Количество тригге-ров на таблицу или представление

Несколько триггеров на одно запускающее триг-геры действие (UPDATE, DELETE или INSERT). sp_settriggerorder позво-ляет задать порядок вы-полнения триггеров.

Один триггер на одно запускающее триггеры действие (UPDATE, DELETE или INSERT)

Page 50: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

50

Каскадные ссылки

Нет ограничений Триггеры INSTEAD OF UPDATE и DELETE нельзя определять для та-блиц, на которые распространяются каскадные ограни-чения ссылочной целостности

Выполнение После следующих опе-раций.

• Обработка ограничений.• Декларативные ссылочные дей-ствия.• Создание таблиц inserted и deleted.• Действие, запу-скающее триггер.

Перед следующей операцией.

• Обработка ограничений.

Вместо следующей операции.

• Действие, запускающее триггер.

После следующих операций.

• Создание таблиц inserted и deleted

Порядок выполнения

Можно задать выпол-нение в первую и в по-следнюю очередь.

Неприменимо

При возникнове-нии ошибки

Нужно выполнить от-кат транзакции

Дополнительные действия не нужны

При успешном за-вершении работы

Дополнительные дей-ствия не нужны

Нужно выполнить действие запу-стившее триггер (данные из таблиц inserted и deleted)

Ссылки на столб-цы varchar(max), nvarchar(max) и varbinary(max) в таблицах inserted и deleted

Разрешены Разрешены

Ссылки на столб-цы text, ntext и image в таблицах inserted и deleted

Не допускается Разрешены

Page 51: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

51

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

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

По умолчанию в SQL Server все триггеры являются AFTER-триггерами.

Программирование триггераПри выполнении команд добавления, изменения и удале-

ния записей сервер создает две специальные таблицы: inserted и deleted. В них содержатся списки строк, которые будут встав-лены или удалены по завершении транзакции. Структура таблиц inserted и deleted идентична структуре таблиц, для которой опре-деляется триггер. Для каждого триггера создается свой комплект таблиц inserted и deleted, поэтому никакой другой триггер не сможет получить к ним доступ. В зависимости от типа операции, вызвавшей выполнение триггера, содержимое таблиц inserted и deleted может быть разным:

команда INSERT – в таблице inserted содержатся все стро-ки, которые пользователь пытается вставить в таблицу; в таблице deleted не будет ни одной строки;

команда DELETE – в таблице deleted будут содержаться все строки, которые пользователь попытается удалить; триггер мо-жет проверить каждую строку и определить, разрешено ли ее удаление; в таблице inserted не окажется ни одной строки;

команда UPDATE – при ее выполнении в таблице deleted находятся старые значения строк, которые будут изменены при успешном завершении триггера. Новые значения строк содер-жатся в таблице inserted.

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

Page 52: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

52

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

Триггер выполняется как неявно определенная транзакция, поэтому внутри триггера допускается применение команд управ-ления транзакциями.

Для удаления триггера используется команда

DROP TRIGGER {имя_триггера} [,...n]

Примеры использования триггеров.R1([Номер счета], Баланс)R2([Номер счета], Сумма, [Дата проведения])

Использование триггера для реализации ограничений на зна-чение. В добавляемой в таблицу R2 записи снимаемая Сумма должна быть не больше, чем Баланс из таблицы R1.

Команда вставки записи в таблицу R2 может быть, напри-мер, такой:INSERT INTO R2 VALUES (‘A123’ , -299 ,’01/08/2013’)

Или INSERT INTO R2 SELECT [Номер счета], -1000,’01/08/2013’

FROM R1 WHERE [Номер счета] LIKE ‘%123’Создаваемый триггер должен отреагировать на ее выполне-

ние следующим образом: необходимо отменить команду, если в R1 величина Баланса оказалась меньше снимаемой Суммы с введенным Номером счета (в примере [Номер счета]= ‘A123’ или [Номер счета] LIKE ‘%123’). Во вставляемой записи сумма ука-LIKE ‘%123’). Во вставляемой записи сумма ука- ‘%123’). Во вставляемой записи сумма ука-зывается со знаком «+», если счет пополняется, и со знаком «-», если с него снимаются деньги. Представленный триггер настроен на обработку сразу всех добавляемых записей, и если хотя бы одна недопустима, происходит откат всех.

CREATE TRIGGER ProvodkaON R2 FOR INSERTASIF @@ROWCOUNT > 0

Page 53: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

53

BEGINIF EXISTS (SELECT * FROM inserted JOIN R1

ON inserted.[Номер счета] = R1.[Номер счета] WHERE R1.Баланс+inserted.Сумма < 0)

BEGIN -- откат действий командыROLLBACK TRANSACTIONRIASERROR(‘Отмена проводки’, 16, 1)

ENDEND

Аналогичные действия, но с использованием триггера INSTEAD OF.CREATE TRIGGER Provodka1ON R2 INSTEAD OF INSERTASIF @@ROWCOUNT > 0BEGINIF NOT EXISTS (SELECT * FROM inserted JOIN R1

ON inserted.[Номер счета] = R1.[Номер счета] WHERE R1.Баланс+inserted.Сумма < 0)

BEGIN -- подтверждение действия командыINSERT INTO R2 SELECT * FROM inserted

ENDEND

Создать триггер для обработки операции удаления записи из таблицы R2, например, такой команды:DELETE FROM R2 WHERE [Дата проведения] = GETDATE()

Для Счетов, номера которых указаны при удалении записи, необходимо откорректировать их Баланс в таблице R1. Триггер обрабатывает все удаляемые записи с использованием курсора.CREATE TRIGGER del_provodkaON R2 FOR DELETEAS DECLARE @nomer varchar(59),@summa money-- создание курсора для обработки отменяемых действийDECLARE provodka_cursor CURSOR FORSELECT [Номер счета], SUM(Сумма) AS S

FROM deleted GROUP BY [Номер счета]OPEN provodka _cursorFETCH NEXT FROM provodka _cursor INTO @nomer , @summaWHILE @@FETCH_STATUS=0

Page 54: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

54

BEGINUPDATE R1 SET Баланс = Баланс + @summaWHERE [Номер счета] = @nomerFETCH NEXT FROM provodka _cursor INTO @nomer, @summa

ENDCLOSE provodka _cursorDEALLOCATE provodka _cursor

Контрольные вопросы1. Что такое триггер?2. Какие виды триггеров бывают?3. Какие основные правила программирования триггеров

FOR?4. Какие основные правила программирования триггеров

INSTEAD OF?5. Какую информацию содержат таблицы inserted и deleted?

Литература1. Бондарь, А. Microsoft SQL Server 2012 / А. Бондарь. – СПб.:

Изд-во: БХВ-Петербург, 2013. – 608 с.2. Вьейра, Р. Программирование баз данных Microsoft SQL

Server 2008. Базовый курс / Р. Вьейра. – СПб.: Изд-во: Диалекти-ка, Вильямс, 2010 г. – 816 с.

3. Ицик, Бен-Ган. Microsoft SQL Server 2012. Высокопро-Microsoft SQL Server 2012. Высокопро- SQL Server 2012. Высокопро-SQL Server 2012. Высокопро- Server 2012. Высокопро-Server 2012. Высокопро- 2012. Высокопро-изводительный код T-SQL. Оконные функции/ Бен-Ган Ицик. – СПб.: Русская Редакция; БХВ-Петербург, 2013. – 256 с.

4. Ицик, Бен-Ган. Microsoft SQL Server 2008. Основы T-SQL / Бен-Ган Ицик. – СПб.: БХВ-Петербург, 2009. – 430 с.

5. URL:http://msdn.microsoft.com/ru-ru/library/bb510741.aspx. Справочник по Transact-SQL (компонент Database Engine).

Page 55: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

55

Оглавление

Введение..............................................................................................31. Транзакции......................................................................................4Блокировки ........................................................................................6Управление транзакциями в среде MS SQL Server........................9Явные транзакции..............................................................................9Вложенные транзакции....................................................................11Уровни изоляции MS SQL Server...................................................122. Операторы процедурной логики.................................................14Переменные......................................................................................14Преобразование типов.....................................................................15Управляющие операторы................................................................17Курсоры.............................................................................................193. Хранимые процедуры...................................................................25Контрольные вопросы.....................................................................324. Пользовательские функции.........................................................33Скалярные функции.........................................................................34Inline функции..................................................................................36Multi-statement функции..................................................................38Встроенные функции.......................................................................39Математические функции...............................................................40Cтроковые функции.........................................................................42Функции для работы с датой и временем......................................445. Триггеры DML..............................................................................45Триггер FOR (AFTER).....................................................................48Триггер INSTEAD OF.....................................................................49Программирование триггера..........................................................51Литература.....................................................................................54

Page 56: Transact-SQL - Yaroslavl State University · 2013-09-10 · Microsoft SQL Transact-SQL Microsoft Jet/Access Jet SQL MySQL SQL/PSM (SQL/Persistent Stored Module) Oracle PL/SQL (Procedural

56

Учебное издание

СоставительВласова Ольга Владимировна

Transact-SQL

Методические указания

Редактор, корректор М. В. НикулинаВерстка Е. Б. Половковой

Подписано в печать 22.07.2013. Формат 60×841/16.Усл. печ. л. 3,25. Уч.-изд. л. 2,0.

Тираж 50 экз. Заказ .

Оригинал-макет подготовлен в редакционно-издательском отделе ЯрГУ.

Ярославский государственный университет им. П. Г. Демидова.

150000, Ярославль, ул. Советская, 14.


Recommended