Введение в системы БД (542480), страница 31
Текст из файла (страница 31)
ном примере, если в таблице Б существует ровно одна строка, удовлетворяющая задан. ному условию ИНЕКЕ, значения столбцов ЯТАТОЯ и С1ТХ из этой строки в соответствии с запросом будут присвоены базовым переменным КАНК и С1ТХ, а переменной БОЬЯТАТ1 будет присвоено значение 00000. Если в таблице Б нет ни одной строки, удовлетворяю щей заданному условию ИНЕКЕ, переменной ЯОЬЯТАТЕ будет присвоено значение 02000 Если же таких строк окажется больше одной, будет зафиксирована ошибка и переменная БОЬЯТАТЕ будет содержать ее код. Оператор 1КЯЕКТ. Вставить в таблицу Р сведения о новой детали (номер детали, е~ название и вес задаются содержимым базовых переменных Р0, РКАКЕ, РИТ соответствен но; цвет детали и город неизвестны). ЕХЕС ЯОЬ 1НБЕКТ 1НТО Р ( Р0, РИАНЕ, ИЕ16НТ ) ЧАЬОЕБ ( :Р0, :РИАНЕ, :РИТ ) Столбцам СОЬОВ и С1ТТ вновь добавляемой строки таблицы будут присвоены значения принимаемые по умолчанию.
Подробнее об этом речь пойдет в разделе 5.5 главы 5. Оператор ОРОАТЕ. Увеличить статус всех поставщиков из Лондона на значение, по мешенное в базовую переменную КА1ЗЕ. ЕХЕС ЯОЬ ОРОАТЕ Я ЯЕТ ЯТАТОЗ = ЗТАТОЯ + :КА1БЕ ИНЕКЕ С1ТХ = 'Ьопдоа' 1ЗО Часть 1. Основные поиятш Если в таблице поставщиков строк, удовлетворяющих условию ИНЕНЕ, найдено не будет, система присвоит переменной БОЬЯТаТЕ значение 02000. Оператор ОЕЬЕТЕ. Удалить сведения обо всех поставках для поставщиков из города, название которого помещено в базовую переменную С1ТХ.
ЕХЕС БОЬ ОЕЬЕТЕ РНОМ ЯР ИНЕНЕ :С1ТХ = ( БЕЗВЕСТ С1ТТ РНОМ Б ИНЕНЕ Я.Я$ -" БР.Б)) ) И снова, если нет строк, удовлетворяющих условию ИНЕНЕ, переменной БОЬБТйТЕ присваивается значение 02000. Также обратите внимание на вложенный подзапрос (на этот раз в предложении ИНЕНЕ). Операции, использующие курсоры Теперь перейдем к вопросу о выборках на уровне множеств, т.е. о выборках не одной строки, как это было в случае однострочного оператора БЕЬЕСТ, а множества с произвольным количеством строк. Как указывачось ранее, в этой ситуации потребуется поочередный доступ к строкам выбранного множества, а механизмом такого доступа будет курсор.
На рис. 4.4 этот процесс схематически проиллюстрирован на примере выборки информации о поставшиках (столбцы Я)), ЯНАМЕ и БТХТНБ) для всех поставщиков из города, название которого задается в базовой переменной 1. Рис 4.4. Выборка нескольких строк Пояснение. Оператор НЕСЫТ Х СОННОЕ... определяет курсор с именем Х, связанный с табличным выражением (т.е. выражением, которое вычисляет таблицу). Табличное выражение определяется оператором ЯЕЬЕСТ, который является частью всего выражения 0ЕСЬЯНЕ.
Причем указанное табличное выражение не вычисляется в этом месте программы, поскольку оператор РЕСЫНЕ СОННОŠ— чисто декларативный. Табличное выражение 1З1 Глава 4. Введение в язык ЯДЕ вычисляется только при открытии курсора (оператор ОРЕМ Х). Далее для выборки строк из результирующего множества, по одной за один раз, используется оператор РЕТСН, присваиваюшнй извлеченные значения базовым переменным в соответствии со спецификациями в предложении 1МТО. (Для простоты базовым переменным присвоены имена, совпадаюшие с именами соответствующих столбцов таблицы базы данных. Обратите внимание, что в операторе БЕЬЕСТ при определении курсора нет своего предложения 1МТО.) Поскольку в результируюшем наборе потенциально присутствует большое количество строк, оператор РЕТСН обычно используется в некотором цикле (оператор ОО...ЕМО в языке Р1Л).
Цикл будет повторяться до тех пор, пока не закончатся строки в результирующем наборе. При выходе из цикла курсор Х закрывается (оператор СЬОЯЕ Х). А теперь рассмотрим курсоры н операции с ними более подробно. Курсор определяется с помошью оператора ОЕСЬХКЕ СОКБОК, общий вид которого следуюший. ЕХЕС БОЬ ОЕСЬХКЕ <иия курсора> СОКБОК РОК <табличное вираженне> ( <упорядочение> ) Для краткости несколько необязательных спецификаций в этом определении не указаны. Здесь параметр <иня курсора> — это имя определяемого курсора. Полное определение табличного выражения, помешаемого в параметр <таблнчное внражение>, дано в приложении А.
Необязательный параметр определения сортировки результата выборки <упорядочение> имеет следующий формат. ОКОЕМ ВУ <список элементов> Здесь параметр <список элементов> содержит список перечисленных через запятую элементов, по которым должно быть выполнено упорядочение извлекаемых строк.
Список элементов не должен быть пустым, в каждом элементе списка должно содержаться имя столбца (заметьте, не уточненное), после которого может следовать необязательное служебное слово ХЯС (по возрастанию) или ОЕБС (по убыванию). При опускании служебного слова по умолчанию принимается порядок по возрастанию (вБС). Замечание. Дадим определение термину список элементов, перечисленных через запятую (сопппа1!м). Пусть <ху-> обозначает произвольную синтаксическую категорию (т.е.
то, что находится слева от некоторого правила вывода в нотации В)ч)Г). Тогда выражение <хух сатта1злг> (или <список ху >) обозначает последовательность из нуля или более элементов <хух>, в которой каждая пара элементов <хут> разделена запятой (и, может быть, одним или несколькими пробелами). Обратим ваше внимание на то, что сокрашение <список ...> будет широко использоваться в приводимых далее синтаксических правилах (причем во всех синтаксических правилах, а не только в правилах языка БО ). Как утверждалось ранее, оператор ОЕСЬХКЕ СОКБОК вЂ” декларативный, а не выполняемый. Он предназначен для объявления курсора с определенным именем и постоянно связанного с ним табличного выражения и типа упорядочения.
Табличное выражение может включать ссылки на базовые переменные. Программа може~ содержать любое количество операторов ОЕСЬвКЕ СОКЯОК, каждый из которых, конечно, предназначен для определения разных курсоров. Для работы с курсорами сушествует три выполняемых оператора: ОРЕМ, ГЕТСН и СЬОЯЕ. 1Зг Часть 1 Основные понятия ° Оператор ОРЕН имеет следующий формат.
ЕХЕС ЯОЬ ОРЕН <имя курсора>; Он предназначен для открытия или активизации указанного курсора (который в данный момент не должен быть открыт). В результате его выполнения вычисляется связанное с этим курсором табличное выражение (причем для всех базовых переменных, упоминаемых в этом выражении, используются текущие значения). В резуль~ате идентифицируется определенное множество строк, которое становится текущим активным набором для данного курсора. Курсор также устанавливает исходную позицию в этом активном наборе, а именно — позицию перед его первой строкой.
(Активные наборы всегда рассматриваются как упорядоченные, а значи~, и понятие позиции имеет для них смысле. Порядок определяется предложением ОКРЕК ВУ; если же оно отсутствует, порядок строк устанавливается системой.) ° Оператор РЕТСН имеет следующий формат. ЕХЕС ЯВЬ <нмя курсора> 1МТО <спнсок ссылок на базовие переменные>; Он служит для перемещения позиции указанного курсора (который должен быть уже открыт) к следующей строке в его активном наборе с последующим присвоением значений столбцов этой строки базовым переменным, указанным в предложении 1НТО.
Если при выполнении оператора РЕТСН следующей строки нет, то никакие данные не выбираются и переменной Б()ЬЯТАТЕ присваивается значение 02000. ° Оператор СЬОБЕ имеет следующий формат. ЕХЕС БОЬ СЬОБЕ <нмя курсора>; Он служит для закрытия (деактивизации) указанного курсора (который должен быть в данный момент открыт). После его выполнения у курсора уже не будет активного набора. Однако в дальнейшем курсор вновь может быть открыт„при этом он опять получит активный набор — возможно, уже не такой, как раньше (в частности, если значения указанных в объявлении курсора базовых переменных к текущему моменту были изменены).
Заметьте, что изменение этих переменных при открытом курсоре не окажет влияния на его активный набор. Есть еще два оператора, в которых могут использоваться ссылки на курсоры, — это СОККЕМТ-формы операторов ОРОйТЕ и ОЕЬЕТЕ. Если курсор (скажем, Х) в данный момент позиционирован на определенную строку, то можно обновить или удалить эту "текущую строку курсора Х", т.е. строку, на которую курсор Х в данный момент позиционирован, как, например, показано ниже. ЕХЕС ЯОЬ ОРОйТЕ Б ЯЕТ ЯТАТЕЯ = ЯТАТОЯ ч :КА1БЕ ЯНЕКЕ СОККЕИТ ОР Х 5 Сами но себе множества, конечно, не являются упорядоченными (глава 5), так что "активный набор" — это на самом деле не множество как таковое.
Его лучше представлять в виде упорядоченного списка или массива (строк). 1ЗЗ Глава 4. Введение в язык ВДЬ Замечание. Выражения ОРОАТЕ.. ЯНЕКЕ СОККЕМТ и ОВЕЕТЕ.. ЯНЕКЕ СОКВЕНТ будут недопустимы, если табличное выражение в объявлении курсора определено с участием необновляемого представления, созданного с помощью оператора СВЕХТЕ ЧХЕМ (подробности приводятся в главе 9, раздел 9.6). Динамический Я0Е Динамический язык ЯЯЬ состоит из набора функций поддержки внедрения Б(1Ь- операторов, предназначенных специально для создания обобщенных, оперативных и, возможно, интерактивных приложений. (Напомним, что, как отмечалось в главе 1, интерактивные приложения — это приложения, которые предоставляют пользователю доступ к базе данных с некоторого интерактивного терминала.) Рассмотрим, что должно делать типичное интерактивное приложение.
Схематически оно должно выполнять (многократно) следующие действия. 1. Принять с терминала команду пользователя. 2. Проанализировать поступившую команду. 3. Сгенерировать соответствующие Я()Ь-операторы для обращения к базе данных. 4. Возвратить сообщение и (или) полученные результаты на терминал. Если набор команд пользователя, который программа может принять с терминала, достаточно мал (как, например, в случае обработки предварительных заказов мест на авиалиниях), то набор всех возможных выполняемых Я)Ь-операторов также будет невелик и его можно будет непосредственно внедрить в программу. В этом случае действия на втором и третьем этапах будут состоять в логической проверке введенной команды с последующим переходом к той части программы, которая выполняет заранее предопределенные БОЬ-операторы.