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

Измененияиудаленияхранимыхпроцедур

ИзменениесуществующейпроцедурыделаетсякомандойALTERPROCEDURE.СинтаксисэтойкомандыничемнеотличаетсяотсинтаксисакомандыCREATEPROCEDURE.Это"мягкий"способизмененияпроцедуры,которыйобычноприменяютдлядобавленияновыхвходныхиливыходныхпараметров.Болеенадежнымспособомсчитаетсяудалениестаройпроцедурыисозданиеновой,стакимжеименем.

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

DROPPROCEDURE<имя_процедуры>

<имя_процедуры>-этопростоимясуществующейпроцедурыбезвсякихпараметров.

Пример:

DROPPROCEDUREMyProc;

Разумеется,изменятьилиудалятьпроцедуруможеттолькоадминистраторSYSDBAилипользователь,создавшийэтупроцедуру.Причемприизмененииилиудалении,процедуранедолжнанаходитьсявиспользовании.

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

Далееследуютпримерыпроцедур,которыенеобходимовыполнятьвInteractiveSQL.Убедитесь,чтосервисInterBaseвключен,загрузитеIBConsole,войдитевбазуданныхFirstивызовитеокноInteractiveSQL.Выполнимследующийпример:

/*Переопредилимтерминатор:*/

SETTERM^;

/*Создаемпроцедуру,котораябудетдобавлятьновыезаписи

втаблицуTable_Firma:*/

CREATEPROCEDUREFirma_Insert

(FVARCHAR(20),IVARCHAR(20),OVARCHAR(20))

AS

BEGIN

INSERTINTOTABLE_FIRMA(FAMILIYA,IMYA,OTCHESTVO)

VALUES(:F,:I,:O);

END^

SETTERM;^

COMMIT;

/*Сразужеприменимполученнуюпроцедурудлявводазначений:*/

EXECUTEPROCEDUREFirma_Insert

('Иванов','Иван','Иванович');

EXECUTEPROCEDUREFirma_Insert

('Петров','Петр','Петрович');

EXECUTEPROCEDUREFirma_Insert

('Николаев','Николай','Николаевич');

COMMIT;

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

Следующийпримерсоздастпроцедурувыборки:

/*Переопределяемтерминатор:*/

SETTERM^;

/*Создаемпроцедуру:*/

CREATEPROCEDUREFirma_Select

RETURNS(FVARCHAR(20),IVARCHAR(20),OVARCHAR(20))

AS

BEGIN

/*Спомощьюциклаполучаемвсестрокитаблицы:*/

FORSELECT*FROMTABLE_FIRMA

INTO:F,:I,:O

DOSUSPEND;

END^

SETTERM;^

COMMIT;

/*ВызовемполученнуюпроцедурукомандойSELECT:*/

SELECT*FROMFirma_Select;

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

Рис.3.1.РезультатдействийпроцедурывыборкиFirma_Select

Каквидите,иперваяивтораяпроцедурывыполнилисвоюзадачу.Мыполучилитакойженаборданных,какизобычнойтаблицы.ВкачествеполейздесьвыступаютвыходныепараметрыF,IиO.

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

SETTERM^;

CREATEPROCEDUREPrimerProc(IINTEGER)

RETURNS(KINTEGER,VVARCHAR(25))

AS

BEGIN

K=0;

WHILE(K<I)DO

BEGIN

K=K+1;

V='Строка№'||K;

SUSPEND;

END

END^

SETTERM;^

COMMIT;

/*Вызываемполученнуюпроцедуру:*/

SELECT*FROMPrimerProc(5);

Обратитевнимание,впроцедуреимеетсявходнойпараметрI,вкотороммыможемпередатьцелоечисло,определяющееколичествостроквполученномнабореданных.ТакжеунасимеетсядвавыходныхпараметраKиV,соответственно,целоечислоистрокаиз25символов.Этипараметрысформируютполяполученногонабораданных.

ДалеемыобнуляемцелуюпеременнуюивызываемциклWHILE,которыйбудетвыполнятьсядотехпор,покапеременнаяKбудетменьшевходящегопараметра.Вциклемывначалеприбавляемкэтойпеременнойединицу,послечегоформируемстрокутипа"Строка№1".Приэтоммыиспользуемзнакконкатенации(объединения)строк"||",авкачествевторойподстрокиподставляемцелоечисло,котороехранитсявпеременнойK.Происходитнеявноепреобразованиетиповданных.Тольконезабывайте,целоечисломожнопреобразоватьвстроку,ноненаоборот!ДалеемывызываемоператорSUSPEND,которыйпомещаетполученнуюстрокувнаборданных.Циклбудетпродолжатьсястолькораз,сколькомыукажемвовходящемпараметрепроцедуры.КогдамывызовемэтупроцедуруоператоромSELECT,тополучимследующийрезультат:

Рис.3.2.РезультатработыпроцедурыPrimerProc

Теперь,открыввдеревесерверовIBConsoleбазуданныхFirst,ивыделивподразделStoredProcedures,выувидитетрисозданныххранимыхпроцедуры,которыевдальнейшемможновызыватьнеоднократно.