|
Программирование >> Хронологические базы данных
Нет причин вдаваться здесь в детали содержимого информационной схемы. Просто приведем некоторые из наиболее важных представлений информационной схемы в надежде на то, что сами названия позволят читателю получить некоторое понятие о содержимом этих представлений. Следует также отметить, что представление TABLES содержит информацию обо всех именованных таблицах, как базовых таблицах, так и представлениях, в то время как представление VIEWS содержит информацию только о представлениях. В [4.19] этот вопрос рассмотрен более подробно, в частности в этой работе рассказывается, как формулировать запросы для получения данных из информационной схемы (что не так просто, как можно было бы ожидать). SCHEMATA (схемы) DOMAINS (домены) TABLES (таблицы) VIEWS (представления) COLUMNS (столбцы) TABLE PRIVILEGES (привилегии для таблиц) COLUMN PRIVILEGES (привилегии для столбцов) USAGE PRIVILEGES (применяемые привилегии) DOMAIN CONSTRAINTS (ограничения для домена) TABLE CONSTRAINTS (ограничения для таблицы) 4.4. Представления Приведем пример определения представления на языке SQL. CREATE VIEW GOOD SUPPLIER AS SELECT S#, STATUS, CITY FROM S WHERE STATUS > 15 ; A вот пример SQL-запроса к этому представлению. SELECT S#, STATUS FROM GOOD SUPPLIER WHERE CITY = London ; REFERENTIAL CONSTRAINTS (ссылочные ограничения) CHECK CONSTRAINTS (проверочные ограничения) KEY COLUMN USAGE (использование столбца ключа) ASSERTIONS (утверждения) VIEW TABLE USAGE (использование таблицы представления) VIEW COLUMN USAGE (использование столбца представления) CONSTRAINT TABLE USAGE (использование таблицы ограничений) CONSTRAINT COLUMN USAGE (использование столбца ограничения) CONSTRAINT DOMAIN USAGE (использование домена ограничения) Подставив определение представления вместо ссылки на имя представления, получим выражение, которое будет подобно приведенному ниже (обратите внимание на вложенный подзапрос в предложении FROM). SELECT G00D SUPPLIER.S#, GOODJUPPLIER.STATUS FROM ( SELECT S#, STATUS, CITY FROM S WHERE STATUS > 15 ) AS GOODJUPPLIER WHERE GOOD SUPPLIER.CITY = London ; Это выражение может быть затем упрощено, например, так. SELECT S#, STATUS FROM S WHERE STATUS > 15 AND CITY = London ; В последнем случае показан текст запроса, который фактически будет выполняться. В качестве второго примера рассмотрим следующую операцию DELETE. DELETE FROM GOODJUPPLIER WHERE CITY = London ; Запрос на удаление, который будет выполняться на самом деле, выглядит так. DELETE FROM S WHERE STATUS > 15 AND CITY = London ; 4.5. Транзакции Для операторов COMMIT и ROLLBACK в языке SQL есть прямые аналоги. Это операторы COMMIT WORK и ROLLBACK WORK соответственно (в обоих операторах слово WORK необязательное). Но в языке SQL нет явного оператора, соответствующего оператору BEGIN TRANSACTION. Неявно транзакция начинается всякий раз, когда программа выполняет оператор, способный инициализировать транзакцию (transaction-initiating), но только в том случае, когда никакая транзакция еще не выполняется. Рассматривать здесь список SQL-операторов, способных инициализировать транзакцию, в наши планы не входит. Достаточно сказать, что таковыми являются практически все операторы, которые мы обсуждаем в этой главе (кроме, конечно, самих операторов COMMIT и ROLLBACK). 4.6. Внедрение SQL-операторов в большинстве SQL-продуктов операторы языка SQL могут выполняться как непосредственно (т.е. интерактивно, с подключенного терминала), так и в виде части прикладной программы (т.е. SQL-операторы могут быть внедренными, а значит, могут смешиваться с операторами базового языка этой программы). Приложения, использующие внедренные SQL-операторы, могут быть написаны на многих базовых языках: COBOL, Java, PL/I и т.д.* Рассмотрим особенности технологии внедрения SQL-операторов более подробно. Фундаментальный принцип, лежащий в основе технологии внедрения SQL-операторов, мы будем называть принципом двухрежимности. Он заключается в том, что любое SQL-выражение, которое можно использовать интерактивно, можно применять и в прикладной программе. Конечно, существует множество различий в деталях между интерактивными SQL-операторами и их внедренными аналогами. В частности, операции выборки требуют существенной дополнительной обработки в вычислительной среде базового языка (подробности приводятся ниже в этом же разделе). Тем не менее сам принцип двухрежимности всегда соблюдается. (Обратное правило, между прочим, не верно, т.е. существует несколько внедряемых SQL-операторов, которые не могут использоваться интерактивно, в чем мы вскоре убедимся.) Прежде чем начать обсуждение конкретных внедряемых SQL-операторов, необходимо обсудить некоторые детали. Большинство из них иллюстрируется фрагментом программы, представленным на рис. 4.3. (Для закрепления наших представлений будем считать, что базовым языком является PL/I. Большинство приводимых примеров транслируется на другие базовые языки лишь с незначительными изменениями.) EXEC SQL BEGIN DECLARE SECTION ; DCL SQLSTATE CHAR(5) ; DCL P# CHAR(6) ; DCL WEIGHT FIXED DECIMAL(5,1) ; EXEC SQL END DECLARE SECTION ; Pi = P2 ; /* например */ EXEC SQL SELECT P.WEIGHT INTO :WEIGHT FROM P WHERE P.P# = :P ; IF SQLSTATE = 00000 THEN ... ; /* WEIGHT = <выбираемое значение> */ ELSE ... ; /* возникла какая-то исключительная ситуация */ Рис. 4.3. Фрагмент програм.мы на языке PL/1 с внедренными операторами языка SQL Рассмотрим все по порядку. 1. Внедренные SQL-операторы предваряются инструкцией EXEC SQL, так что их легко отличить от других операторов базового языка, и заканчиваются специальным завершающим символом (точка с запятой ; для языка PL/I). Стандарт языка SQL [4.22] в настоящее время поддерживает языки Ada, С, COBOL, Fortran, М (раньше он назывался MUMS), Pascal и PL/I. Требование поддержки языка Java на время написания книги еще отсутствовало, но должно было быть добавлено в ближайшее время (подробности приводятся в [4.6], а также в приложении Б), причем некоторые продукты уже поддерживают язык Java.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |