Введение в системы БД (542480), страница 30
Текст из файла (страница 30)
4.6. Внедрение $01.-операторов В большинстве ЯЭЬ-продуктов операторы языка Я()Ь могут выполняться как непосредственно (т.е, интерактивно, с подключенного терминала), так и в виде части прикладной программы (т.е. ЯЯЬ-операторы могут быть внедренными, а значит, могут смешиваться с 126 Часть з Основные понятия операторами базового языка этой программы). Приложения, использующие внедренные БОЬ-операторы, могут быть написаны на многих базовых языках: СОВОЬ, Зача, Р1Л и т.д.л Рассмотрим особенности технологии внедрения БОЬ-операторов более подробно.
Фундаментальный принцип, лежащий в основе технологии внедрения БОЬ- операторов, мы будем называть принципом двухрежимности. Он заключается в том, что любое БД/:выражение, которое можно использовать интерактивно, можно применять и в прикладной программе. Конечно, сушествует множество различий в деталях между интерактивными БОЬ-операторами и их внедренными аналогами. В частности, операции выборки требуют сушественной дополнительной обработки в вычислительной среде базового языка (подробности приводятся ниже в этом же разделе).
Тем не менее сам принцип двухрежимности всегда соблюдается. (Обратное правило, между прочим, не верно, т.е. существует несколько внедряемых БО -операторов, которые не могут использоваться интерактивно, в чем мы вскоре убедимся.) Прежде чем начать обсуждение конкретных внедряемых Б >Ь-операторов, необходимо обсудить некоторые детали. Большинство из них иллюстрируется фрагментом программы, представленным на рис. 4.3. (Для закрепления наших представлений будем считать, что базовым языком является РЬ/1. Большинство приводимых примеров транслируется на другие базовые языки лишь с незначительными изменениями.) ЕХЕС ВОВ ВЕО1Н ОЕСВАКЕ ЯЕСТ10К ОСЬ ВОВВТАТЕ СНАК(5) 1 001 Р() СНАК(б) 0СВ ИЕ1ОНТ Р1ХЕО ОЕС1МАВ(5,1) 1 ЕХЕС В01 ЕКО 0ЕСВАКЕ ВЕСТ10К Р() = 'Р2' 1 )* например '/ ЕХЕС ВОВ НЕВЕСТ Р.ИЕ1ОНТ 1КТО :ИЕ16НТ РВОМ Р ИНЕКЕ Р,Р() = :Р() 1 1Р ВОВВТАТЕ и '00000' ТНЕК ...
1 )* ИЕ16НТ = <вмбираемое значение> '/ ЕВЯЕ ... 1 /ь возникла какая-то исключительная ситуация */ Рис. 4 3. Фрагмент программы на языке Р/// с внедренными операторами языка БДЬ Рассмотрим все по порядку. 1. Внедренные БОЬ-операторы предваряются инструкцией ЕХЕС Б01ь так что их легко отличить от других операторов базового языка, и заканчиваются специальным завершающим символом (точка с запятой ";" для языка РЬ/1).
4 Стандарт языка БДЛ [4.22) в настоящее время поддерживает языки Аг(а, С, СОВОК Ростан, М (раньше он назывался М((МБ/, Ровса/ и Р/г/. Требование поддержки языка ./ача на время написания книги еще отсутствовало, но должно было быть добавлено в ближайшее время (подробности приводятся в /4.б/, а также в приложении БА причем некоторые продукты уже поддерживают язык ./ача. и7 Глава 4.
Введение в язык ЯДА 2. Выполняемый БЯЬ-оператор (далее до конца этого раздела уточнение "внедренный" обычно будет опускаться) может быть в программе везде, где могут быть выполняемые операторы базового языка, Обратите внимание на уточнение "выполняемые": в отличие от интерактивного режима использования языка БОЬ, режим внедрения БОЬ-операторов подразумевает включение в программу отдельных БОЬ-операторов, которые являются чисто декларативными, а не выполняемыми. Например, оператор ОВСОВЕ СОННО — это невыполняемый оператор (подробности приводятся в разделе "Операции, использующие курсоры"); таковыми не являются и операторы ВЕО1Н и ЕНО ОЕСййВЕ ЯЕСТ1ОН (см.
п. 5 этого списка), а также оператор ННЕНЕЧЕВ (см. п. 9). 3. БОЬ-операторы могут включать ссылки на базовые переменные (т.е. переменные базового языка). Подобные ссылки должны включать префикс в виде двоеточия, предназначенный для отличия их от имен столбцов Б()Ь-таблиц. Базовые переменные могут применяться во внедренных БОЬ-операторах везде, где в интерактивном языке БОЬ могут использоваться литералы. Они могут также находиться в предложении 1НТО операторов ЯЕЬЕСТ (см. п. 4) и ГЕТСН (подробности — в разделе "Операции, использующие курсоры"), определяющих результирующие переменные для размешения результатов выборки данных.
4. Обратите внимание на предложение 1НТО оператора БЕЗВЕСТ, представленного на рис. 4.3. Назначение этого предложения (как только что отмечалось) — указать результируюшие (целевые) переменные, в которые будут возврашены выбранные значения. Каждая ~'-я целевая переменная, указанная в предложении 1НТО, соответствует йму извлекаемому значению, указанному в списке выборки предложения НЕВЕСТ. 5. Все базовые переменные, на которые ссылаются внедренные БОЬ-операторы, должны быть определены (в РЬВ это оператор ОСЕ) в разделе объявлений внедренного языка Я1Ь, который ограничивается операторами ВЕ61Н 0ЕСЕВВЕ ЯВСТ10Н и ЕН0 0ЕСЕВВЕ ЯЕСТ10Н. 6.
Каждая программа, содержащая внедренные ЯГЕЛЬ-операторы, должна включать базовую переменную с именем ЯЦЬЗТВТЕ. После выполнения любого присутствующего в программе Б()Ь-оператора в эту переменную возврашается код состояния. В частности, код состояния 00000 означает, что оператор был выполнен успешно, а код состояния 02000 — что оператор был выполнен, но никаких удовлетворяющих запросу данных найдено не было. Таким образом, выполнение в программе каждого БОЬ-оператора должно завершаться проверкой значения переменной ЯОЬЗТйТЕ и, если это значение будет отличаться от ожидаемого, должны предприниматься соответствуюшие действия.
На практике, однако, такая проверка обычно выполняется неявно (см. п. 9). 7. Базовые переменные должны иметь типы данных, соответствующие значениям, для размешения которых эти переменные используются. В частности, базовая переменная, используемая в качестве целевой (т.е. для размешения результатов операции ЯЕЕЕСТ), должна иметь тип данных, который совместим с типом выражения, представляющего значение, присваиваемое этой целевой переменной. Аналогично, если базовая переменная служит источником (например, для операции 1НЯЕВТ), она должна иметь тип данных, совместимый с Б()Ь-типом того столбца, которому при- 128 Часть 1.
Основные понятия сваивается значение из этого источника. Подобные замечания касаются также ба- зовых переменных, используемых в сравнениях или в любых других операциях. В официальном документе стандарта 14.22] подробно объясняется, что для двух ти- пов значит быть совместимыми. 8. Базовые переменные для столбцов ЯОЬ-таблиц могут иметь те же имена, что и имена соответствуюших столбцов. 9. Как уже упоминалось, выполнение каждого 9 )Ь-оператора, в принципе, должно сопровождаться проверкой значения, возврашаемого в переменной БОБЯТАТЕ.
Для упрошения этого процесса предназначен оператор ИНЕЫЕЧЕВ, который имеет следуюший синтаксис. ЕХЕС ЯОБ ИНЕНЕЧЕВ <условие> <действие>; Здесь параметр <усповие> может принимать значение либо БОНЕВВОВ (ошибка 9 ПЬ), либо ИОТ ГООВО (не найдено), а параметр <действие> — это либо оператор СОНТ1ИОЕ (продолжить), либо оператор 00 ТО (перейти к). Оператор ИНЕИЕЧЕВ не является выполняемым; это просто директива для БОЬ-компилятора. Наличие в программе выражения "ИНЕИЕЧЕВ <условие> 60 ТО <иетка>" приведет к тому, что компилятор поместит оператор "1Г <условие> 60 ТО <иетка> ЕНО 1Г" после каждого встретившегося ему выполняемого БОЬ-оператора. Однако, встретив выражение "ИНЕНЕЧЕВ <усповие> СОИТ1МНЕ", 9 >Ь-компилятор не вставляет в программу никаких операторов и, следовательно, программист должен будет вставить требуемые операторы вручную.
Два фиксированных значения условия определяются так. ИОТ ГООВО ЯОБЕВВОВ означает никаких данных не найдено — ЯОБЯТАТЕ = 02000 (обычно) означает возникла ошибка - см. описание стандарта 14.22] для переменной ЯОББТАТЕ Каждый оператор ИНЕИЕЧЕВ, который процессор 9 ИЬ встречает при последовательном сканировании текста программы (для определенного условия), отменяет предыдущий (для этого условия). 10. Используя терминологию главы 2, отметим, что внедрение ЯОЬ-операторов устанавливает слабую связь между БОЬ-средой и базовым языком.
129 Глава 4. Введение в язык 5Ь)л", Итак, для предварительного обсуждения этого достаточно. Далее мы сосредоточимся на операторах манипулирования данными. Как уже отмечалось, большинство из них можно использовать практически в неизменном виде (т.е. лишь с незначительными изменениями в синтаксисе). Однако операции выборки требуют особого рассмотрения. Проблема состоит в том, что такие операторы в обшем случае выбирают не одну, а множество строк, в то время как процедурные базовые языки обычно не приспособлены для выборки более одной строки за одно обращение.
Следовательно, необходимо обеспечить своего рода "мост" между уровнем выборки "множество-за-один-раз" в языке ЯОЬ н уровнем выборки "строка-за-один-раз" в базовом языке. В качестве подобного моста используются курсоры. Курсор — это специальный тип ЯОЬ-объекта, который применяется только во внедренном языке Яч,Н (поскольку в интерактивном языке БОЬ в нем нет необходимости). Курсор представляет собой определенный тип логического указателя, который может использоваться для перемешения по набору строк, указывая поочередно на каждую из них и таким образом обеспечивая возможность адресации к этим строкам — к одной за один раз.
Однако временно отложим подробное обсуждение курсоров и рассмотрим сначала такие операторы, для которых курсоры не требуются. Операции, не использующие курсоры Ниже перечислены операторы манипулирования данными, для которых не требуется использование курсоров.
° Однострочный оператор ЯЕЬЕСТ ° 1ИЯЕВТ ° ОРОАТЕ (кроме формы СОККЕНТ) ° ОЕЬЕТЕ (также кроме формы СОККЕНТ) Рассмотрим примеры лля каждого из этих операторов. Однострочный оператор ЯЕЬЕСТ. Получить статус и название города для поставщика, номер поставки которого задан в базовой переменной 01ЧЕНБ0. ЕХЕС ЗЦЬ ЯЕЬЕСТ БТАТОБ, С1ТХ 1НТО !ВАКХ, сс1ТХ РКОМ Я ИНЕКЕ Б0 = г01ЧЕИЯ0 ) Термин однострочный оператор ЯЕЬЕСТ используется для обозначения выражения ЗЕЬЕСТ, значением которого будет таблица, содержащая не более одной строки. В дан.