Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции БДиСУБД.docx
Скачиваний:
17
Добавлен:
19.11.2019
Размер:
494.91 Кб
Скачать

Хранимыепроцедуры(StoredProcedures)

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

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

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

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

SETTERM<новый_терминатор><старый_терминатор>

CREATEPROCEDUREИмя_Процедуры

[(<входной_параметр><тип_данных>

[,<входной_параметр><тип_данных>[…]])]

[RETURNS

(<выходной_параметр><тип_данных>

[,<выходной_параметр><тип_данных>[…]])]

AS

<тело_процедуры>

<тело_процедуры>=

[DECLARE[VARIABLE]<переменная><тип_данных>;[…]]

BEGIN

<составнойоператор>

END<терминатор>

SETTERM<старый_терминатор><новый_терминатор>

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

Терминаторы

ТерминатораминазываютсясимволыокончанияSQLоператора.Установкатерминаторовнеотноситсянапрямуюксинтаксисухранимыхпроцедурилитриггеров,однакопопыткасозданияпроцедурыбезпереопределениятерминатора,скореевсего,приведеткошибке.Деловтом,чтовнутрисоздаваемойпроцедурынеоднократноможетвстречатьсясимвол";",которыйпоумолчаниюявляетсясимволомконцаоператоравязыкеSQL.ВэтомслучаеутилитаIBConsoleрешит,чтооператорзакончен,ипопытаетсяеговыполнить.Нопроцедураещенебудетпрочитанадоконца,чтоиприведеткошибке.Выход:переопределитьтерминатор.Делаетсяэтодовольнопросто:

SETTERM<новый_терминатор><старый_терминатор>.

Вкачественовогосимволаокончаниявыможетеиспользоватьлюбойредкийсимвол,например"^"или"&".Затемвтелепроцедурыможетсколькоугодноразвстречатьсясимвол";",SQLприэтомневосприметегокакокончаниеоператора.ЗавершающуюENDпроцедурыследуетзакрытьустановленнымвамитерминатором,вэтомслучаепроцедурабудетпрочитанаIBConsoleдоконцаивыполненабезошибок.Анапоследоквывновьпереопределяететерминатор,устанавливаястандартныйсимвол";".Например:

SETTERM^;

CREATEPROCEDURE……^

SETTERM;^

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

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

Заголовок

Заголовокпроцедурысостоитизследующихразделов:

  1. Имяпроцедуры-обязательныйэлемент.Имядолжнобытьуникальнымвовсейбазеданных.Пример:

CREATEPROCEDUREProc1

  1. Входныепараметры-необязательныйэлемент.Входныепараметры,какивпроцедурахDelphi,служатдляпередачивпроцедурукаких-тозначенийизвнешнегоприложения,другойпроцедурыилитриггера.Приэтомтипыданныхэтихпараметровмогутбытьлюбыми,определеннымивSQL,кромемассивов.Параметрыобъявляютсяввидесписка"параметртип",несколькопараметровразделяютсязапятой.Именавходныхпараметровпроцедурынеобязанысоответствоватьименампараметроввызывающегоприложения,нотипыданныхдолжнысовпадать.Пример:

  2. CREATEPROCEDUREProc2

(perem1Integer,perem2Float,perem3Date)

  1. Выходныепараметры-необязательныйэлемент.Выходныепараметрыслужатдлявозвратаввызывающееприложениеспискарезультирующихзначений.Объявлениевыходныхпараметров(еслиониесть),начинаетсяключевымсловомRETURNS,послекотороговскобкахпараметрыперечисляютсяввидесписка"параметртип".Пример:

  2. CREATEPROCEDUREProc3

  3. (vhod_param1Integer)

RETURNS(vihod_param1Double,vihod_param2Varchar(10))

  1. КлючевоесловоAS-обязательныйэлемент,указывающийнаокончаниезаголовкапроцедуры.Пример:

  2. CREATEPROCEDUREProc4

  3. RETURNS(paramchar(50))

AS