Фуфаев - Разработка и эксплуатация удалённых БД (1084483), страница 29
Текст из файла (страница 29)
В СУБД Асссза предлагается программный интерфейс АОО, представляющий собой надстройку над интерфейсом ОВВС. 150 Внедренные операторы подразделяют на статические и динамические. Текст статического оператора должен быть полностью внедрен в текст программы, а к динамическому оператору во время выполнения программы можно обращаться, как к модулю или подпрограмме. 10.2. Выполнение однострочных и многострочных запросов с помощью внедренных операторов ВСН. и курсоров Как уже говорилось, внедрение всех операторов ВОЬ кроме ВЕЬЕСТ не вызывает особых проблем при разработке программ на базовых языках. Простое же внедрение оператора ВЕЬЕСТ в текст программы приводит к тому, что результирующий набор данных будет состоять только из одной строки соответствующей таблицы.
Это обусловлено тем, что операторы языков программирования высокого уровня работают только с отдельными элементами, представляющими собой отдельные строки данных, в то время как оператор языка Я ~Ь может обрабатывать произвольное число строк данных. Для устранения такой несогласованности в языке ВОЬ предусмотрены специальные функции, позволяющие связывать переменные базового языка со строками таблиц баз данных, которые обрабатываются (возвращаются) по одной при каждом последовательном обращении.
С учетом этого все запросы на языке Я)Ь подразделяют на две группы: однострочные и многострочные. Очевидно, что результатом выполнения однострочного запроса является только одна строка данных. Результатом же выполнения многострочного запроса могут быть структуры. состоящие из произвольного числа строк от нуля до и. Однострочные запросы. Язык ВОЬ для реализации внедренных однострочных запросов предусматривает использование специального онератора единичной выборки с форматом, не отличающимся от формата оператора ВЕЬЕСТ, за исключением дополнительной конструкции 1)х)ТО, предназначенной для указания имен переменных базового языка, в которые следует поместить результаты запроса. Конструкция 1!чТО должна следовать непосредственно за списком полей оператора ВЕЬЕСТ.
Между выражениями в списке ВЕЬЕСТ и переменными базового языка в конструкции 1)х!ТО должно существовать взаимно-однозначное соответствие для обеспечения выборки сведений из таблицы базы данных. Рассмотрим пример. Пусть необходимо выбрать сведения о владельце недвижимости с номером СО2! из таблицы с именем РпчагОтчег. 151 Используем следующую конструкцию оператора ВЕ1.ЕСТ: ЕХЕС ЯОЬ БЕЗВЕСТ г Наше, 1иате, аодгеяя ТНТО : г 1гясиаве, :1аясиаве, :а<1Нгеяя :ас1геяятпс1 РНОМ Рг1чаГОеег ИНЕНЕ оепегио = 'СО21' Здесь значение столбца Г магде будет помещено в переменную базового языка г" пя11чагпе, значение столбца Пчагпе — в переменную 1ая11чагпе, а значение столбца агЫгеяя — в переменную агЫгезя (вместе с индикатором значения Х131.1, для которого используется переменная адгеяя!по).
Естественно, все применяемые в данном операторе переменные должны быть объявлены заранее согласно правилам базового языка. Многострочные запросы. Для реализации запросов, в результате выполнения которых может быть получено произвольное количество сгрок, язык Я~1. предоставляет программисту механизмы выборки данных, основанные на использовании курсоров. Например, в языке Р1./Я'.11 курсор позволяет программе построчно обрабатывать результаты выполнения запроса, т.е.
в этом случае он представляет собой указатель на определенную строку в результирующем наборе данных. Курсор можно передвигать с одной строки на другую и после обработки одной строки переходить к следующей. Перед работой курсор должен быть объявлен н открыт, а после завершения работы — закрыт. Для объявления курсора используется следующая структура: ЕХЕС ЯОЕ Пкскйпк <имя курсора> СПНБОН РОН <запрос> Рассмотрим пример текста программы, объявляющей курсор: ЕХЕС БОй РЕСЬйик ргорегсуспгяог СПНЯОН ГОН БЕЕЕСТ ргорегсуио, ясгеес, с1су РНОМ Ргорегсурогпепс ИНКНК ясаГГНо = Я141' В данном примере объявляется курсор с именем ргорепуСцгзог для выбора данных из таблицы РгореггуГогКепг по полям ргорену1чо, яггеег, с11у при условии, что значение переменной ягай 1чо равно 'Я.4Г Для открытия объявленного курсора применяется оператор ОРЕХ, имеющий следующую структуру: КХКС Яак ОРКН ргорегсуепгяог РОК НКйПОНЕУ После открытия курсора производится выбор информации из таблицы с применением оператора ГЕТСН согласно заданным в курсоре условиям: 152 ЕХЕС ЯОЬ РЕТСН ргорегсуСцгзог 1ИТО : рхореггуно, зстеег, сьоу; При обработке оператора ГЕТСН значение столбца ргорелу) [о будет помещено в переменную базового языка ргорепуйо, а значение столбцов ягеег и сйу — соответственно в переменные ягеег и сйу.
Поскольку при выполнении запроса оператор ЕЕТСН обрабатывает только одну строку таблицы, в тексте программы на базовом языке он должен быть помещен внутрь соответствующего цикла, обеспечивающего требуемое число просмотров всех записей таблицы. В этом случае СУБД помещает в переменную БО[.СОРЕ значение [х[ОТ ЕО1ЛМР. Если таблица не содержит ни одной строки данных„при выполнении запроса в первом же шаге цикла будет обнаружено их отсутствие и переменной БО[.СОРЕ вернется значение НОТ ГО1)ХР. После выполнения запроса курсор должен быть закрыт с помощью оператора С1.ОБЕ, имеющего следующую структуру: ЕХЕС ЯОЬ СЬОЯЕ рторетгуСцгвот; 10.3.
Модификация таблиц баз данных с помощью курсоров Курсор может быть предназначен как для чтения, так и для обновления таблиц баз данных. Обновлять данные в таблицах (обновляемый курсор) курсор может с использованием оператора 1[РРАТЕ или РЕ[.ЕТЕ С[)ККЕ[х[Т. Если курсор является обновляемым, то согласно стандарту 130/ЕС 9075 — 2003 конкретные разработчики СУБД могут вносить в него свои функции.
Так, в СУБД Огас[е для создания обновляемых курсоров используют следующие дополнения к оператору РЕС1АКЕ С1)КБОК: ЕХЕС ЯОЬ ЭЕСЬйНЕ < имя курсора > СОНЯОН ГОН < имя таблицы > ГОН ОРОЛТЕ ОР < имена всех столбцов таблицы > Более того, эти же столбцы должны быть перечислены и в списке конструкции БЕ1.ЕСТ.
Вид операторов обновления данных можно показать на следующем примере: ЕХЕС ЯОЬ ОРЭАТЕ ТаЬ1енате ЯЕТ со1цтиате = с[аСауа1це [,...] ИНЕНЕ СОННЕНТ ОР сцтвогиаве В этом примере параметр сцгзогХате представляет собой имя открытого обновляемого курсора. Конструкция %НЕКЕ исполь- 153 зуется для определения строки, на которую в данный момент указывает курсор, и все вносимые обновления будут выполняться только для этой строки.
Каждое имя столбца обновляемой таблицы в конструкции ЯЕТ должно быть указано в операторе РЕСЬАКЕ С() КБОК. Удаление строк можно выполнять с помощью обновляемых курсоров, например имеющих следующую структуру: ЕХЕС ЯОЬ ОЕЬЕТЕ ГКОМ Кгорегеурогиепс ИНЕКЕ СОККЕИТ ОГ ргорегоуСегвог Выполнение такого курсора приведет к удалению строки таблицы, связанной с текущим положением курсора ргорепуСцгзог. Для того чтобы можно было применять позиционные операторы удаления (РЕ1.ЕТЕ) и модификации (ОРРАТЕ), курсор должен удовлетворять следующим требованиям: ° запрос, связанный с курсором, должен считывать данные из одной исходной таблицы, т.е.
в предложении ГКОМ запроса ЯЕЬЕСТ, связанного с определением курсора (РЕСЬАКЕ С()КБОК), должна быть задана только одна таблица; ° в запросе не может присутствовать параметр упорядочения ОКРЕК ВУ. Для того чтобы сохранялось взаимно-однозначное соответствие строк курсора и исходной таблицы, курсор не должен идентифицировать упорядоченный набор данных; ° в запросе не должно присутствовать ключевое слово Р1$Т1ХСТ; ° запрос не должен содержать операций группировки, т.е. в нем не должно присутствовать предложение ОКО()Р ВУ или НАЧ1ХО; ° пользователь, который хочет применить операции позиционного удаления или обновления, должен иметь соответствующие права на выполнение данных операций над базовой таблицей.
Использование курсора для операций обновления значительно усложняет работу СУБД, поэтому операции, связанные с позиционной модификацией, выполняются гораздо медленнее, чем операции с курсорами, которые используются только для чтения. Именно поэтому рекомендуется обязательно указывать в операторе определения курсора предложение КЕАР ОХЬУ, если вы не собираетесь использовать данный курсор для операций модификации. По умолчанию, если нет дополнительных указаний, СУБД создает курсор с возможностью модификации. Курсоры — удобное средство для формирования бизнес-логики приложений, однако следует помнить, что если вы открываете курсор с возможностью модификации, СУБД блокирует все строки базовой таблицы, вошедшие в него, и тем самым блокируется работа с данной таблицей других пользователей.
154 Чтобы свести к минимуму число требуемых блокировок, при работе интерактивных программ следует придерживаться следующих правил: ° делать транзакции как можно короче; ° выполнять оператор завершения СОММ1Т после каждого запроса и как можно скорее после изменений, сделанных программой; ° избегать программ, в которых осуществляется интенсивное взаимодействие с пользователем или просмотр очень большого числа строк данных; ° по возможности не применять прокручиваемые курсоры (БСКОЬЕ), так как они требуют блокирования всех строк выборки, связанных с открытым курсором; ° использовать простой последовательный курсор, который позволит системе разблокировать текущую строку, как только будет выполнена операция ЕЕТСН, что минимизирует блокировки других пользователей, работающих параллельно с вами и использующих те же таблицы; ° по возможности определять курсор как КЕАО 01х11Л'; ° так как при рассмотрении модели клиент — сервер определено, что в развитых моделях серверов баз данных большая часть бизнес-логики клиентского приложения выполняется именно на сервере, следует использовать специальные объекты, называемые хранимыми процедурами и хранящиеся в БД, как таблицы и другие базовые объекты.