КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Разработка хранимых процедур
Для приложений, работающих с БД, хранимые процедуры (Stored Procedure) — это подпрограммы, которые выполняются на сервере. По отношению к БД — это объекты, которые создаются и хранятся в БД и могут быть вызваны из клиентских приложений. При этом одна процедура может быть использована в любом числе клиентских приложений, что позволяет существенно экономить трудозатраты на создание прикладного программного обеспечения и эффективно применять стратегию повторного использования кода. Так же как и любые процедуры в стандартных языках программирования, хранимые процедуры могут иметь входные и выходные параметры или не иметь их вовсе. Хранимые процедуры могут быть активизированы не только пользовательскими приложениями, но и триггерами. Хранимые процедуры пишутся на базовом языке программирования, могут включать в себя любые операторы SQL, а также включают в себя некоторый набор операторов, управляющих ходом выполнения программ, во многом схожих с подобными операторами процедурно-ориентированных языков программирования. В коммерческих СУБД для написания текстов хранимых процедур используются собственные языки программирования. Так, в СУБД Oracle для этого используется язык PL/SQL, а в MS SQL Server — язык Transact SQL. В последних версиях Oracle для написания хранимых процедур объявлено использование языка Java. Хранимые процедуры являются объектами БД. Каждая хранимая процедура компилируется при первом выполнении, при этом в процессе компиляции строится оптимальный план выполнения процедуры. Описание процедуры совместно с планом ее выполнения хранится в системных таблицах БД. Для создания хранимой процедуры в SQL применяется оператор CREATE PROCEDURE. По умолчанию выполнить хранимую процедуру могут только ее владелец, являющийся владельцем БД, и создатель. Однако владелец хранимой процедуры может делегировать права на ее запуск другим пользователям. Имя хранимой процедуры является идентификатором в языке программирования, на котором она пишется, и должно удовлетворять всем требованиям» предъявляемым к идентификаторам в данном языке. В MS SQL Server хранимая процедура создается оператором следующего формата:
Здесь необязательное ключевое слово VARYING определяет заданное значение по умолчанию для определенного ранее параметра. Если задано ключевое слово RECOMPILE, определяющее режим компиляции создаваемой хранимой процедуры, то данная процедура будет перекомпилироваться каждый раз, когда будет вызываться на исполнение, что может резко замедлить ее исполнение. Однако, с другой стороны, если данные, обрабатываемые данной хранимой процедурой, настолько динамичны, что предыдущий план исполнения, составленный при ее первом вызове, может быть абсолютно неэффективен при последующих вызовах, стоит применять данный параметр при создании этой процедуры. Ключевое слово ENCRYPTION определяет режим, при котором исходный текст хранимой процедуры не сохраняется в БД. Такой режим применяется для сохранения авторского права на интеллектуальную продукцию, которой и являются хранимые процедуры. Исходные тексты разработанных хранимых процедур не должны быть доступны администратору базы данных заказчика. Однако все остальные параметры помимо имени хранимой процедуры являются необязательными. При этом процедуры могут быть и процедурами-функциями. Эти понятия трактуются здесь традиционно, как в языках программирования высокого уровня. Хранимая процедура-функция возвращает значение, которое присваивается переменной, определяющей имя процедуры. Явная процедура не возвращает значение, но в ней может быть использовано ключевое слово OUTPUT, определяющее, что данный параметр является выходным. Рассмотрим несколько примеров простейших хранимых процедур.
Хранимая процедура может быть вызвана несколькими способами. Простейшим способом является использование оператора EXEC: EXEC <имя процедуры> <значение_входного_параметра1>... <имя_переменной_для_выходного параметра 1>... При этом все входные и выходные параметры должны быть обязательно заданы в том порядке, в котором они определены в процедуре. Например, если надо найти число имеющихся в библиотеке экземпляров книги «Огас1е8. Энциклопедия пользователя» с ISBN 966-7393-08-09, текст вызова ранее созданной хранимой процедуры может быть следующим:
Если определены несколько версий хранимой процедуры, то при вызове можно указать номер конкретной версии для исполнения. Например, во второй версии процедуры COUNTEX последний оператор ее исполнения имеет следующий вид: EXEC @Ntek =COUNT_EX:2 @ISBN Однако если в процедуре определены значения входных параметров по умолчанию, то при ее запуске можно указывать значения не всех параметров. В этом случае оператор вызова процедуры можно записать в следующем виде:
Например, создадим процедуру, которая считает число книг, изданных конкретным издательством в конкретном году (при создании процедуры в качестве года издания по умолчанию зададим значение текущего года):
Теперь вызовем эту процедуру, для чего подготовим переменную, в которую можно, поместить результаты ее выполнения: declare @N int Переменная @N содержит число книг в библиотеке, изданных Издательским центром «Академия» в текущем году. Можно также обратиться к данной процедуре, задав все параметры:
В результате получим число книг, изданных Издательским центром «Академия» в 2004 г. и имеющихся в наличии в библиотеке. Задавая параметры по именам, необязательно использовать тот порядок, в котором они описаны при создании процедуры. Каждая хранимая процедура является объектом БД, т.е. она имеет уникальное имя и уникальный внутренний номер в системном каталоге. При изменении текста хранимой процедуры следует сначала удалить ее как объект, хранимый в БД, и только после этого записать вместо нее новую процедуру. Отметим, что при удалении хранимой процедуры удаляются одновременно все ее версии. Для того чтобы автоматизировать процесс удаления старой процедуры и замены ее новой, в начале текста хранимой процедуры можно выполнить проверку наличия объекта типа «хранимая процедура» с заданным именем в системном каталоге. При наличии описания данного объекта удалить его из системного каталога. В этом случае текст хранимой процедуры предваряется специальным оператором проверки и может иметь, например, следующий вид:
Если инкрементное поле не использовалось в качестве инвентарного номера экземпляра, можно самим назначать этот инвентарный номер, увеличив на единицу номер последнего хранимого в библиотеке экземпляра книги. Можно также попробовать просто сосчитать число существующих экземпляров в библиотеке, но если при этом некоторые из них отсутствуют, номер нового экземпляра может быть уже использован, и тогда нельзя будет ввести данные, так как система не позволит нарушить уникальность первичного ключа. Текст процедуры в этом случае будет иметь следующий вид:
Хранимые процедуры могут вызывать одна другую. Создадим хранимую процедуру, которая возвращает номер читательского билета для конкретного читателя:
В данной процедуре использовалась функция преобразования типа данных dataTime в тип данных varchar(8). Это было необходимо сделать для согласования типов данных при выполнении операции сравнения. Действительно, входная переменная ©BIRTHDAY имеет символьный тип (varchar), а поле базы данных BIRTHDAY имеет тип SmallDateTime. Хранимые процедуры допускают наличие нескольких выходных параметров, для чего каждый из этих параметров после задания ему типа данных должен иметь дополнительное ключевое слово OUTPUT. Рассмотрим пример хранимой процедуры с несколькими выходными параметрами. Создадим процедуру ввода нового читателя, причем внутри этой процедуры выполним проверку наличия в картотеке данного читателя, чтобы не назначать ему новый номер читательского билета. При этом выходными параметрами процедуры будут номер читательского билета, признак того, был ли ранее записан читатель с данными характеристиками в нашей библиотеке, а если он был записан, то сколько книг за ним числится. Данная процедура будет иметь следующий вид:
Хранимые процедуры также играют ключевую роль в повышении быстродействия работы в сети с архитектурой клиент—сервер. В этом случае клиент обращается к серверу только для выполнения команды запуска хранимой процедуры, которая выполняется на сервере. Объем пересылаемой по сети информации при этом резко сокращается.
Дата добавления: 2014-01-07; Просмотров: 1064; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |