Теория и практика построения баз данных (1088289), страница 94
Текст из файла (страница 94)
Хранимые процедуры могут иметь параметры, вызывать другие процедуры и функции, возвращать значения и генерировать исключения. Хранимые процедуры могут вызываться удаленно. Примеры вызова хранимых процедур с использованием интернет-технолопш вы увидите в главах 15 и 16. Здесь мы рассмотрим два примера хранимых процедур. Листинг 12.5. Процедура Сов!отлет )пзег! СРЕАТЕ ОР РЕРЬАСЕ РРОСЕООРЕ СызСопег !пвегт пеипаве !И спаг, пеиагеасобе 1И сйаг.
пеирПопе 1И сПаг, агствьпаьтопа)яту 1И сПаг ) А5 гоисооп! 1пвеоег(4); СОР50Р агстзссыгзог !5 5ЕЕЕСТ Агтт'зь!О ГРОМ АРТ!5Т МНЕРЕ Мат!опа)тту=агстзспа'стопа!!Ьу ВЕС!М 5ЕЕЕСТ ГРОМ МНЕРЕ Своп'ь (*) 1МТО гоисоопт СОВТОНЕР Иаяяе=пеипаве АИО Агеа Собебпеиагеасобе АИО РПопе ИыгЬег = пеирпопе; !Г гоисооп! > 0 ТНЕИ ВЕС!М ОВМ5 ООТРОТ,РОТ Е!МЕ С Клиент ухе есть в базе данных — никаких действий не предпринято'); РЕТОРМ; ЕМО; ЕИО !Г; продолжения,р Хранимая процедура Сиа1отег 1паег1 Галерее т/!еш ВЫВе требуется воэможность добавлять в базу данных новых клиентов и записывать информацию о художниках, работами которых клиенты интересуются. В частности, нужно записывать имя и телефоны клиента, а также ассопиировать его со всеми художниками выбранной национальности.
В листинге 12.5 тюказана хранпмая процедура, выполпякицая эту задачу. Процедура которая называется Сив1ошег 1пвегТ, принимает четыре параметра: пеипаше (ымя нового клиента), пеиагеасот!е (код региона), пеирйопе (телефон) и ат1!в!паТ!опа!!Ту (национальность художника). Ключевое слово 1М указывает па то, что все эти параметры являются входными. Выходные параметры (которых у этой процедуры нет) обозначаются ключевым словом ООТ, а параметры, играюшпе роль и входных, и выходных, — сочетанием 1И ООТ.
Обратите внимание, что для параметра указывается тип данных, но не длина. Огас1е определит длину из контекста. 442 Глава 12. Работа о базами данных в Огас!е Логика приложения 443 Листинг 12.5 !продолжение) 1И5ЕИТ 1ИТО С05ТОМЕВ (Сыввовег!0. йвве. Агеа Сабе. Рйопе Мывоег) УАСОЕ5 !Савв!0.йехтва!.
Пенлаве, ленагеасобе, ленрлопе): РОВ агв)вс 1И агв1втсыгвог СВОР 1И5ЕИТ 1ИТО С05ТОМЕВ АЙТ15Т !МТ (Совсовег10, Ягв)вг!0) УАСОЕ5 (Савв!О.Сыггуа), агг)вЬ.Агв1в110); ЕИО СОВР; ОВМ5 00ТРОТ.РОТ С!ИЕ С Новый клиент успешно добавлен в базу '): СИО. Раздел объявления переменных следует за ключевым словом А5. Оператор 5ЕСЕСТ определяет переменную-курсор (спгваг т апаЫе) с именем агв)ввсигвог.
Этот курсор выделяет из таблицы АВТ15Т для обработки строки всех художников заданной национальности. В первом разделе процедуры выполняется проверка, нет лн уже в базе инфорт мации о данном клиенте. В этом случае никакия действия не предпринимаются, а пользователю с помощью пакета Огас1е ОВМ5 ООТРОТ выводится соответствующее сообщение. Прежде чем мы продолжим обсуждение этой процедуры, обратите внимание, что пользователь получит это сообщение только в том случае, если процедура будет вызвана из 5О). Р!пв.
В случае вызова процедуры иным путем, например с помощью браузера через Иптерпет, пользователь не увидит этого сообщения. Чтобы сообщить пользователю об ошибке, разработчик должен воспользоваться выходным параметром или сгенерировать исключение, Эти вопросы, однако, выходят за рамки настоящей дискуссии. Синтаксис для вывода строки и значения переменной, хотя это не показано в листинге 12.5, имеет внд ОВМ5 ООТРОТ.РОТ С1МЕ('строка//переменная). Кроме тога, чтобы такие сообщения стали видимыми, следует выполнить команду 5ег вегиегоыгрыг оп; Если при работе в 5О!.
Р!цв вы не видите сообщений, выводимых вашими процедурами, скорее всего, вы не выполнили этот оператор. Оставшаяся часть процедуры в листинге 12.5 вставляет данные о новом клиенте и затем перебирает всех художников выбранной национальности. Обратите внимание на использование специальной конструкции РЕ/5ОЕ РОВ агт)в11М агв)втсыгвог. Эта конструкция выполняет несколько задач. Прежде всего, она открывает курсор и считывает первую строку.
Затем она последовательно обрабатывает все строки под курсором и по окончании обработки передает управление следующему оператору после РОВ. Заметьте также, что обращение к столбцу Агв)в)10 текущей строки происходит с использованием синтаксиса агт)вв.дггЫ10, где аг11вв — это имя перемелной цикла РОВ, а не курсора. После того как процедура написана, ее необходимо скомпилировать и сохранить в базе данньгх. Наберите текст процедуры в редакторе и сохраните его под именем, скажем, 5Р С1.вд!. Если в последней строке файла вы поместите косую черту, то процедура будет скомпплирована и сохранена в базе данных автоматически паоле ввода команды 5сагг 5Р С1 Если вы что-то ввели неправильно, у вас магд т возникнуть ошибки компиляции.
К сожалению, ВЯЖИ. Р!пв не покажет вам этн ошибки автоматически, а выдаст сообщение: «)Иагп!пд: Ргосебиге сгеавег) илвП соглрйабоп еггогв, («Предупреждение: нри компиляции процедуры обнаружены ошибгиг»). Чтобы увидеть ошибки, эвелине команду 5Пон еггогв: Если синтаксических ошибок не было, вы получите сообщение «Ргосеацге сгеатег)» («Процедура создана»). Теперь вы можете вызывать эту процедуру с помощью команд ЕХЕСОТЕ или ЕКЕС; Ехес Сыввовег !пвегЬС5е)ва Магп1од'. '206'. '555-0099', '05'); Если возникнут ошибки на этапе выполнения процедуры, номера строк в отчете об ошибках не будут совпадать с номерами строк, которые вы можете видеть в своем текстовом редакторе. Вы можете настроить ЯЯТ.
Р!цв так, чтобы выводимые номера строк соответствовали вашим, но этот процесс слишком сложен, чтобы описывать его здесь С тени простыми процедурами, которые мы будем рассматривать, можно обойтись и без этого. Главное, имейте в виду, что номера строк могут не совпадать. Хранимая процедура йетвгСиа1оптег1йШ11Тгапаасбоп В главе 1О были описаны процедуры на языке ВО1 для создания, чтения, модификации в удаления представления базы данных, изображенного на рис. 10.4. Хранимая процедура, реализующая процесс создания этого представления, показана в листинге 12.6. Листинг 12.6.
Процедура П)е»уСпэ1огпегФ1)ПТгапэаст)оп СВЕАТЕ Ой ВЕРСАСЕ РВОСЕООВЕ МенСывтовегй11ПТгапваст)оп ! ленлаве !й снаг. ленагеасобе 1М сПаг, ленрноле 1И сПаг, агт1вславе !И сйвг ногкв)Г1е !М сПаг, ногксору 1И снаг. рг1се !й лывЬег ) Логика приложения 445 Листинг 12.6 (продолжение) А5 ВЕ61И /* Клиент уже есть в базе данных? */ ЕИО: 444 Глава 12. Работа с базами данных в Огас)е гоысаип( тп(ецег (2) ; (та тот; ата тг(; СОЙ5ОЙ Сгапвсигзог !5 5ЕСЕСТ Тгапзасвтап!О.
АКТ!5Т.Агттвт10 ГРОМ АКТ!5Т. ИОРК, ТКАИ5АСПОИ ИНЕКЕ йаще=агттзапаще АИО Ттт)егыогхттв!е АИО Сору-ыогйсору АИО ТКАИ5АСТ!ОИ.Сцзташег!О 15 ИОЕЕ АИО АКТ!5Т.Агьтзт!0 = ИОРК.Агтт'вт!0 Ай0 НОКК.йогд!О = ТКАИ5АСТ10й,йогй!О; 5ЕЕЕСТ Сонат (*) 1ИТО гоысоцпт ГРОМ СО51ОМЕЙ ИНЕЙЕ йаще=пеыпаще Ай0 Агеа Саае=пеыагеасоае Ай0 Рлопе йцшЬег - пеырлопе !Г гоысоцпт > 0 ТНЕИ ВЕ6!й ОВМ5 ООТРОТ.РОТ Е(ИЕ ('Сцв1ошег А)геабу Ехтвьз -- Ио Ас1зоп Тайен'); КЕТОКИ; ЕИО; ЕИО 1Г; /* Клиента нет в базе данных добавляен нового клиента */ !И5ЕКТ 1ИТО СО5ТОМЕК (Сцзтощег10, йаще, Агеа Свае, Риале йцшаег) ЧАСОЕ5 (сцзт10 йехСЧа), пеыпаше. пенагеасаае, пеырйопе): /* Ищем одну и талька одну свободную строку в таблице ТКАИ5АСТ!ОИ.
*/ гонсоцпс :5 О: ГОК !гааз !п Сгапзсцгзог ЕООР тт'О := агапа,)гапяасю оп!О; ата ;= 'ьгапз АгС1зт!О; гаысоцп1 '.= гонсоцпь + 1; ЕИО ЕООР; 1Г гансоцпт > 1 Тлел ВЕ61И /* Слишком много свободных строк -- выдаен сообщение об ошибке. отменяем изненения и выходим из процедуры */ КО( ЕВАСК; ОВМ5 ООТРОТ.РОТ Е1ИЕ (' Неверные данные в таблицах АКТ15Т/ИОРК/ТЙАИ5АСТ1ОИ -- нинаких действий не предпринято '); ЙЕТОЙИ; ЕИО: Ей0 !Г; 1Г гонсоцпь 5 О Тлеп ВЕ6!й /* Нет ни одной свободной строки -- выдаеи сообщение об олибке, отиеняем изменения и выходин из процедуры */ КОЕЕВАСК: ОВМ5 ООТРОТ.РОТ Е(ИЕ (' Ни одной свободной строки в таблице ТЙАИ5АСТ10И -- нйкаких действий не предпринято '); КЕТОЙИ: ЕИО: ЕИО !Г; /* Есть равно одна строка -- используем ее.
Идентификатор транзакции, лолучекный из тгапвсигвог. находится в переменной Ста */ ОВМ5 ООТРОТ РОТ Е!ИЕ (Сто); ОРОАТЕ ТКАИ5АСТ10И 5ЕТ Сцзсощег10 = Сцзт!О.Сцггча!. 5а!езрюсе = ргтсе, РцгсаазеОаае5узОате ИНЕКЕ Тгапзасвтоп!0 = 1та; ОВМ5 ООТРОТ.РОТ Е!ИЕ (' Клиент добавлен в базу данных, данные транзакций обновлены '): /* Теперь регистрируем интерес данного клиента к даннону художнику */ /* Используеи идентификатор художника, находящийся в переменной ата, и текуц|ее значение последовательности СцггЧа! */ !И5ЕКТ !ИТО СО5ТОМЕР АКТ!5Т !ИТ (Агтт'зт10.