Книги, научные публикации Pages:     | 1 |   ...   | 3 | 4 | 5 |

С. Н. Смирнов, И. С. Задворьев Учебное пособие 2-е издание исправленное и дополненное Москва 2002 УДК 681.3.06 32.973.2 57 Смирнов С. И. С. ...

-- [ Страница 5 ] --

плана выполнения При формировании плана выполнения запроса оптимиза тор обычно принимает верные решения. Как правило, 95% всех запросов в не нуждаются в дополнительной на стройке. Оставшиеся 5% проблемных запросов подлежат Ли бо ручной коррекции, которая была рассмотрена выше, либо принудительному изменению и фиксации плана с помощью подсказок. На основе сведений о данных в таблицах для за просов, которые выполняются недостаточно быстро, пользо ватель может выбрать иной план выполнения, чем тот, что автоматически генерирует оптимизатор.

Для изменения и фиксации плана выполнения запроса с помощью подсказок необходимо выполнить следующие опе рации:

Ч зафиксировать порядок обхода таблиц с помощью подсказки ORDERED;

Ч зафиксировать методы доступа с помощью подсказок FULL, INDEX и т. д.;

Ч зафиксировать методы соединения таблиц помощью подсказок USE_NL, Ч дополнительными подсказками тонко настроить за прос.

Дальнейшее изложение будем иллюстрировать на приме ре. Пусть таблицы и созданы предложениями:

CREATE TABLE (Atl NUMBER, NUMBER, CREATE TABLE Tab2 (Atl NUMBER, At Построим для них индексы с помощью следующих вы ражений:

CREATE INDEX Tabl$Atl ON CREATE INDEX Tab2$Atl ON CREATE INDEX Tab2$At2 ON Заполним таблицы случайными данными с помощью следующего анонимного PL/SQL-блока (предварительно соз дав циклическую последовательность Ч генератор этих дан ных).

CREATE SEQUENCE sq$Tab MAXVALUE 10 CYCLE CACHE 5;

BEGIN FOR i IN 1. LOOP INSERT INTO 15,2);

END FOR i IN LOOP INSERT INTO Tabl 15,3);

END END;

Заполним таблицу случайными данными с помощью другого анонимного PL/SQL-блока:

Методы BEGIN FOR i IN LOOP INSERT INTO Tab2. 1);

END FOR IN 1. LOOP INSERT INTO Tab2 2);

END LOOP;

FOR i IN 1. LOOP INSERT INTO Tab END END;

Теперь у нас есть большая (миллион строк) таблица и связанная с ней относительно маленькая таблица Пусть требуется выполнить следующий запрос:

Tabl.At2, Tab WHERE AND AND Tab2.At2=l GROUP BY Отправим его на выполнение и отметим, выполняется он достаточно долго. Очевидно, требуется внести коррективы в план выполнения запроса. Настройка любого проблемного запроса начинается с просмотра собственно плана. Для этого предназначена команда EXPLAIN PLAN. Результаты созда ния плана сохраняются в специальную таблицу которую предварительно необходимо создать с помощью специального сценария. Каждому выражению, для которого создается план, пользователь назначает специ альный идентификатор (в данном примере После созда ния плана его можно просмотреть с помощью специального иерархического запроса в SQL*Plus (объем текста запроса не позволяет привести его в книге полностью) или в каком-либо графическом средстве, например в SQL Navigator.

План выполнения запроса, который предложил оптимиза тор Oracle, приведен ниже.

SQL> DELETE FROM plan_table 2 WHERE = 2 rows deleted.

COMMIT;

Commit SQL> EXPLAIN PLAN SET FOR 2 SELECT Tabl.At2, FROM Tab 3 WHERE 4 AND 5 AND Tab2.At2=l 6 GROUP BY SQL> COMMIT;

Commit Ч результат специального иерархического запроса SELECT STATEMENT Z Optimizer: CHOOSE 2.1 SORT (GROUP BY) TABLE ACCESS (BY INDEX - TAB NESTED LOOPS 5.1 TABLE ACCESS (BY INDEX ROWID) - TAB 6.1 (NON-UNIQUE) 5. 7 rows selected.

222. План выполнения запроса, предложен ный оптимизатором Oracle Что же представляет собой этот план? План выполнения запроса представляет собой пошаговые действия сервера при к данным на основании сведений, полученных на шагах. Графически план представляется ft виде древовидной структуры, пример которой приведен в листинге 222. Рассмотрим, какие действия при выполнении запроса будет производить сервер, руководствуясь этим планом.

В нашем случае сначала по индексу был найден идентификатор строки в таблице у которой значение Методы столбца равно Затем по этому идентификатору про изошло обращение к самой таблице за значением столб ца Atl в этой строке. Если бы индекс Tab2$At2 был ным и наряду с At2 включал в себя и то обращения к таблице не бы вовсе, необходимое значение было бы считано из индекса.

На следующем шаге по найденному значению из таб лицы происходит поиск в индексе таблицы значений. Такой порядок действий сервера будет пред принят для всех записей таблиц и Если соответст вующие значения в индексе будут найдены, то по идентифи каторам строк таблицы из индекса происходит обраще ние к таблице за необходимыми для вычислений значе ниями столбцов, которых нет в индексе Для наше го примера это At2 и At3. На следующем этапе происходит сравнение значения столбца At3 с константой и, если оно истинно, то эта строка из таблицы будет учитывать ся в конечном результате (в той или иной группе зависи мости от значения столбца At2). В нашем случае оптимизатор выбрал способ соединения таблиц с помощью вложенных циклов, поэтому изложенная последовательность действий сервера будет использована каждой строки таблицы циклично. Последний этап плана выполнения запроса (сор тировка) появился из-за присутствия в запросе агрегирующей Приступим к оптимизации запроса. Как отмечалось выше, качественная оптимизация невозможна без знаний о данных априори либо знаний, которые пользователь может собрать сам с помощью простых запросов, условия которых, как правило, частично взяты из оптимизируемого запроса. В этом случае посмотрим, как распределены значения, для ко торых у нас есть условия сравнения с константами Tab2.At2=l). Выясняется, что в записей со значением столбца At2, равным 1, примерно треть, а в записей со значением столбца At3, равным 2, около ста. Ме процента! Очевидно, что целесообразнее поиск именно с Пользуясь таким хорошим логическим усло вием провести ее полное сканирование, ото брать эти строк и уже по их найти подхо дящие строки в (таких строк будет немного, так как таб лица небольшая) и для них выполнить операцию срав нения с константой А так как таблица не большая, то для нее также можно использовать полное скани рование и отказаться от метода соединения с женных циклов, применив, например, Приступим к реализации этой идеи. Начнем с фиксации порядка обхода таблиц. Подсказка ORDERED указывает на то, что порядок обхода таблиц слева направо Ч таблицы со единяются в той последовательности, в какой они перечисле ны во фразе FROM. Обратите внимание, если эту подсказку не использовать, то оптимизатор сам примет решение, в какой последовательности соединять таблицы (как правило, в об ратной последовательности, чем таблицы перечислены во фразе FROM). Рекомендуется таким образом организовать соединение, чтобы на ранних этапах (в начале списка таблиц) были таблицы, на данные в которых накладываются самые селективные условия. Делается это для того, чтобы было как можно меньше операций соединений со строками из других таблиц на следующих этапах. Если в запросе выполняется соединение большой таблицы, для которой целесообразно полное сканирование, с несколькими маленькими, практиче ски всегда целесообразно ее поставить на первое место. Спи сок подсказок, влияющих на последовательность обхода лиц, приведен в таблице 34.

Таблица 34. Методы обхода таблиц Подсказка Описание ORDERED Использование порядка таблиц, указан ного в предложении FROM, в качестве порядка их объединения.

повышения производительности PUSH_SUBQ Использование плана выполнения за проса с вложенным подзапросом на пер вом месте.

STAR Использование плана выполнения за проса на основе составного ключа ("звездочки") при разрешении объеди нения.

После фиксации порядка соединения таблиц необходимо указать методы доступа к ним с помощью подсказок, которые описаны в таблице Если эта подсказка содержит список доступных индексов, то вычисляет стоимость просмотра по каждому из индексов в списке, после чего вы бирает метод доступа с наименьшей стоимостью. Полное сканирование таблицы или доступ с использованием других индексов (не перечисленных в списке) оптимизатором не рас сматриваются.

В заключение следует указать методы соединения таб лиц. Эти методы перечислены в таблице 35. Их назначение понятно из названий. Для того чтобы выполнить соединение для двух таблиц, соединение способом вложенных циклов использует в цикле строки ведущей таблицы для поиска под ходящих по условию соединения строк другой таблицы: по сле первой Ч вторую, третью и т. д. При сортировке слияни ем производится сортировка строк по столбцу, по ко торому выполнятся соединение и затем производится их слия ние. Этот способ характеризуется большими затратами ресур сов на сортировку и должен использоваться аккуратно. В пользу его выбора может повлиять необходимость получения отсортированных результатов (наличие в запросе конст рукции ORDER BY) или наличие подходящих индексов. От некоторых недостатков сортировки со слиянием освобождено хэш-объединение, в котором используется для значений по которому производится объединение.

Как правило, чаще всего используется самый простой способ Ч объединение с помощью вложенных циклов.

Таблица 35. Методы объединения таблиц Подсказка Описание USE NL Использование вложенных циклов.

USE MERGE Использование сортировки со слиянием.

USE HASH Использование hash-объединения.

Оптимизированный запрос представлен в листинге SQL> DELETE FROM plan_table 2 WHERE statement_id = 2 rows deleted.

SQL> Commit complete.

SQL> EXPLAIN PLAN SET FOR 2 SELECT /*+ ORDERED 3 USE_HASH 4 FROM Tab2 WHERE 5 AND 6 AND Tab2.At2=l GROUP BY Ч результат специального иерархического запроса 1.0 SELECT STATEMENT Z Optimizer: CHOOSE Cost SORT BY) HASH JOIN 4.1 TABLE ACCESS (FULL) - TAB 4.2 TABLE ACCESS (FULL) - TAB Листинг 223. с подсказками оптимизатору и его план выполнения, полученный EXPLAIN PLAN Методы Секционирование таблиц Понятие секционирования может иметь много разных значений. В Oracle подразумевается, что термин секциониро вание (partitioning) означает возможность разбиения на раз делы (секции) таблиц и индексов. Секции образуют новый физический уровень архитектуры Oracle, который находится между таблицей и ее экстентами. При этом отобра жается на набор секций, которые в свою очередь, однозначно отображаются на набор экстентов, а каждый экстент отобра жается на одно или несколько табличных пространств с од ним или несколькими файлами данных.

Секционирование таблиц и индексов применяется, как правило, в двух случаях:

Ч падение производительности при увеличении объемов обрабатываемых данных;

при проектировании, когда прогнозируется большой размер создаваемых таблиц.

Средства секционирования можно использовать наряду с параллельными запросами. Степень параллелизма обычно устанавливается кратной количеству секций, которые образуют таблицу. При этом используются не только пре имущества исключения секций, но и возможность параллель ного выполнения запросов по отношению к неисключенным секциям.

В таблица или индекс может содержать до секций. Ключом секционирования (partition key) называется столбец (столбцы), на основании которого выполняется сек ционирование таблицы или Ключ секционирования может быть составным и насчитывать до В стве ключа секционирования обычно выбирается столбец, значения которого редко изменяются, равномерно распреде лены и для которых можно выделить логические интервалы.

Например, время начала разговора для таблицы, в которой Х ' Раздел хранятся сведения о телефонных разговорах. Секции в этом случае могут содержать разговоры, которые были в течение одних суток или одной недели. В секционированных табли цах не поддерживаются кластеры и большие объекты (напри мер, объекты LONG и RAW). Пример создания секциониро ванной таблицы приведен в листинге 224.

CREATE TABLE 2 (Atl NUMBER, 3 PARTITION BY RANGE (Atl) 4 (PARTITION VALUES LESS THAN (10001) 5 TABLESPACE STORAGE (INITIAL 1M NEXT 1M), 6 PARTITION p2 VALUES LESS THAN (20001) 7 TABLESPACE Ts2. STORAGE (INITIAL NEXT, 8 PARTITION p3 VALUES LESS THAN "(30001) 9 TABLESPACE Ts3 STORAGE (INITIAL 1M NEXT 10 PARTITION VALUES LESS THAN (40001) 11 TABLESPACE STORAGE (INITIAL 1M NEXT 12 PARTITION p5 VALUES LESS THAN (50001) 13 TABLESPACE Ts5 1M NEXT ) Table created.

Пример создания секционированной таблицы Выражение VALUES LESS THAN указывает верхнюю границу секции. Например, секция может содержать стро ки со значением столбца не превышающим 10000 (LESS THAN в предложении VALUES LESS THAN означает строго меньше). Такое автоматически устанавливается в каждой секции. Например, при попытке вставить строку со значением 60000 столбца Atl будет получено сообщение об так как максимальное допустимое значение для крайней секции (р5) равно INSERT INTO Методы повышения INSERT INTO * ERROR at line 1:

inserted key does not to any partition 225. Пример попытки вставки записи, у ко торой значение столбца-ключа секционирова ния не попадает в указанный при создании таблицы диапазон Для чтобы избежать возникновения таких ошибок, при создании таблиц следует указывать специальную границу для крайней секции.

SQL> CREATE TABLE Tab 2 NUMBER, 3 PARTITION BY RANGE 4 (PARTITION VALUES LESS THAN (10001), 5 PARTITION p2 VALUES LESS THAN 6 PARTITION LESS THAN 7 PARTITION p4 VALUES LESS THAN (40001), 8 PARTITION p5 VALUES LESS THAN Table created.

SQL> INSERT INTO Tab2 ) 1 row Пример создания секционированной с указанием специальной границы для крайней секции Единственным отличием двух последних примеров явля ется указание ключевого слова MAXVALUE для крайней сек ции. Следует учесть, что в предложении VALUE LESS THAN не допускается использование значений NULL. В тех когда вставляются строки со значениями ключа секциониро вания NULL, строки сортируются так же, как строки, которые обладают большими литеральными значениями, чем у но меньшими, чем значение MAXVALUE.

Ключ секционирования может быть создан на основе не скольких столбцов (то есть быть составным). При этом при оритет операций сравнения убывает слева направо и, если в такой операции сравнения используется значение MAXVALUE, все остальные расположенные за ним значения игнорируются. Секционирование по составному ключу имеет смысл применять для таблицы с составным первичным клю чом или при необходимости разбить ее на секции по комби нациям первичного ключа и внешних ключей часто объеди няемых таблиц. В листинге 227 представлен пример создания таблицы с составным ключом секциони рования.

SQL> CREATE TABLE 2 NUMBER, NUMBER, At 3 PARTITION BY RANGE 4 (PARTITION VALUES LESS THAN 5 PARTITION p2 VALUES LESS THAN (20001,20), 6 PARTITION p3 VALUES LESS THAN 7 PARTITION p4 VALUES LESS THAN 8 PARTITION p5 VALUES LESS THAN Table created.

попадет в секцию SQL> INSERT INTO 5, 1 row created.

попадет в секцию РЗ SQL> INSERT INTO 1 row created.

Листинг Пример секционирования таблицы с ис пользованием составного ключа секционирова ния повышения индексов В секционированных и несекционированных таблицах могут использоваться четыре основных типа индексов:

Ч несекционированный индекс;

Ч глобальный префиксный индекс;

Ч локальный префиксный индекс;

Ч беспрефиксный индекс.

Секционированные и несекционированные таблицы мо гут иметь как секционированные, так и несекционированные индексы. Единственным ограничением в данном случае явля ется невозможность секционирования кластерного индекса.

Индекс считается префиксным (prefixed), если его край ние слева столбцы находятся в том же порядке и имеют точно такой же размер, как и ключ секционирования. Кроме того, подобные индексные столбцы могут быть ключа секционирования, но не его подмножеством.

Глобальный (global) индекс только префикс ным, но его секционирование обычно отличается от секцио нирования связанной с ним таблицы. Глобальные индексы не поддерживаются в Oracle, то есть поддерживаются особые взаимосвязи (соответствие диапазона значений) между сек ционированным индексом и секционированной таблицей. Ос новным недостатком глобального индекса является то, что оптимизатор Oracle не может использовать преимущества исключения секций. G другой стороны, глобальные индексы могут быть разбиты на секции на основе значе ний, отличных от тех, которые имеются в связанной с ним таблице. Это может быть полезным при работе с несколькими индексами, которые связаны с приложениями интерактивной аналитической обработки.

Локальный индекс может быть префиксным или беспрефиксным. В случае его использования между секциями индекса и соответствующими секциями таблицы устанавли № Раздел вается взаимно однозначное соответствие. Такое секциониро вание называется эквивалентным и поддер живается Oracle. Оптимизатор использует преимуще ства отсутствия обращения к секциям. Следовательно, основ ными преимуществами локальных индексов являются авто матическая эквивалентная для всех секций поддержка раз биения и соответствующие преимущества от использования оптимизатора. Единственным недостатком локального индек са является необходимость иметь такое же секционирование, как и для связанной с ним таблицы (независимо от того, пре фиксный этот индекс или беспрефиксный).

Следующий пример содержит SQL-выражение для созда ния секционированной таблицы и связанных с ней локального префиксного и локального беспрефиксного индексов.

CREATE TABLE Tab 2 NUMBER, NUMBER, At 3 PARTITION BY RANGE - 4 (PARTITION VALUES LESS THAN (10001), PARTITION p2 VALUES LESS THAN (20001), 6 PARTITION p3 VALUES LESS THAN (30001), 7 PARTITION p4 VALUES LESS THAN Table created.

SQL> CREATE INDEX Tab4$Atl$At2 ON Tab 2 LOCAL 3 (PARTITION 4 PARTITION p2, 5 PARTITION p3, 6 PARTITION Index created.

SQL> CREATE INDEX Tab4$At 2 ON Tab4 (At2) 3 LOCAL 4 (PARTITION 5 PARTITION P2, PARTITION P3, повышения Index created.

228. Пример создания секционированной таблицы и связанных с ней локального и беспрефиксного индексов Обратите внимание на то, что в случаях не предложения PARTITION BY RANGE и VALUES LEES так как с помощью ключевого слова LOCAL Oracle уведомляется о типе индекса и в индексе будет приме нено эквивалентное секционирование по тем же специфика циям, которые используются в таблице.

Операции с секциями Для выполнения всех операций с секциями предусмотре но использование двух основных выражений: ALTER TABLE и ALTER INDEX. Эти выражения обладают следующими предназначенными для работы с секциями: Х Таблица Операции с секциями ALTER TABLE ALTER INDEX DROP PARTITION DROP PARTITION ADD PARTITION RENAME PARTITION RENAME PARTITION REBUILD PARTITION MODIFY PARTITION MODIFY PARTITION TRUNCATE PARTITION SPLIT PARTITION SPLIT PARTITION PARALLEL MOVE PARTITION UNUSABLE EXCHANGE PARTITION MODIFY PARTITION Многие из операций, связанных с работой с секциями, уже по своим названиям могут быть понятны или известны, поскольку, на первый взгляд, они выглядят так же, как 15* операции с таблицами и индексами, например DROP TABLE и DROP INDEX. Однако здесь следует обратить более пристальное внимание на расширения, которые свойственны только секциям (SPLIT, MOVE, EXCHANGE и UNUSABLE).

Проиллюстрируем технику работы с секциями на примере таблицы созданной следующим выражением:

CREATE TABLE ТаЫ NUMBER, NUMBER, At PARTITION BY RANGE (Atl) (PARTITION VALUES LESS THAN PARTITION p2 VALUES LESS THAN (20001), PARTITION p3 VALUES LESS THAN На основе секции рЗ с помощью спецификации PARTITION создадим новую секцию р4. Прежняя секция рЗ будет содержать все строки, для которых значения поля Atl меньше значения 25000, а новая секция р4 будет содержать все строки, значения которых больше или равны 25000.

SQL> ALTER TABLE SPLIT PARTITION рЗ 2 AT (25000) 3 INTO (PARTITION p3, PARTITION Table altered.

229. Изменение способа секционирования таблицы с. помощью конструкции PARTITION В листинге 230, изменяется место хранения одной из таблицы ALTER TABLE ТаЫ PARTITION рЗ Table altered.

Изменение места хранения секции рЗ с помощью оператора ALTER TABLE повышения Как уже отмечалось выше, для ранних версий Oracle проводилось ручное секционирование путем создания не скольких таблиц и представления UNION ALL над ними. Для миграции из такой базы данных специально предназначена команда EXCHANGE PARTITION. С ее помощью можно преобразовать как таблицу в секцию, так и наоборот. Резуль тат преобразования секции в несекционированную таблицу представлен в листинге В этом примере включаются ин дексы и не производится проверка значений для перемещаемых строк.

-SQL> ALTER TABLE EXCHANGE PARTITION 2 WITH TABLE INCLUDING INDEXES 3 WITHOUT VALIDATION;

Table altered.

231. Пример преобразования секций и лиц Индекс-таблица Ч это таблица, которая физически по строена в виде двоичного дерева относительно своего пер вичного ключа. Oracle, начиная с версии 6, допускает воз можность не производить чтение блоков данных таблицы в тех случаях, когда в запросах на выборку данных использу ются только столбцы индекса. Однако при операциях добав ления, обновления и удаления записей должна была участвовать основная таблица. Начиная с ствует возможность определить таблицу, которая одновре менно является и собственным индексом, что устраняет веде ние двух отдельных структур. Как правило, это таблицы с ко роткими строками, обращение к которым всегда производит ся или по первичному ключу, или полным сканированием.

Раздел Не рекомендуется использовать индекс-таблицы, если строки имеют относительно большую длину, например свы ше 20% от размера блока. В этом случае лучшим выбором является использование обычных таблиц и индексов. Для создания индекс-таблиц в предложении CREATE TABLE ука зываются ключевые слова ORGANIZATION INDEX. Пример создания индексно-организованной таблицы представлен в листинге 232.

SQL> CREATE TABLE 2, NUMBER PRIMARY KEY, 4 INDEX;

Table created.

Пример создания индекс-таблицы " Существуют некоторые ограничения при работе с ин декс-таблицами. Наиболее важно, что их строки не имеют идентификаторов (ROWID), поэтому не могут быть созданы никакие дополнительные за исключением обяза тельного первичного ключа.

Раздел расширения в В конце 60-х годов в методологии программирования возникла идея объединить два понятия: данные и операции в одно целое, которое впоследствии получило название объект:

Объект = Данные + Операции.

Понятие объекта естественным образом с нашими представлениями об окружающем мире. Объект можно представить себе как сущность предметной области, которая характеризуется определенным набором свойств "умеет" выполнять некие действия (методы). Чтобы понять суть и назначение объекта, нужно обязательно знать его свой ства и методы.

Каждый объект всегда принадлежит некоторому классу.

Класс Ч это обобщенное описание множества однотипных объектов. Объекты являются конкретными представителями своего их принято называть экземплярами класса. В объектно-реляционных СУБД классы принято называть объ ектными типами.

Объектно-ориентированное программирование строится на основе трех принципов: инкапсуляции, наследовании и полиморфизме.

Инкапсуляция означает наблюдаемое в объектах объеди нение данных и операций в одно целое, которое ведет со крытию внутреннего устройства объектов.

Наследование означает, что на основе уже существующих объектов можно строить новые, которые могут отличаться от родительского объекта собственными методами и свойства ми. Иными словами, при наследовании происходит переход общего к частному.

Полиморфизм означает, что в производных объектах функционирование наследуемых операций может быть изме нено. При этом весь код, управляющий элементами родитель ского объекта, пригоден для управления дочерним объектом без всякой модификации.

можно считать первым корпорации на эволюционном пути к объектной ориентации. ра ботает с объектами с помощью процессора реляционной данных. Такой механизм в конечном счете должен привести к истинно объектно-ориентированным системам управления базами данных В настоящее время сервером под держиваются инкапсуляция и полиморфизм. В следующей версии сервера (Oracle 9i) декларируется поддержка меха низма наследования.

Объектные типы Под объектным типом понимается объект базы данных Oracle, которая объявляет структуру данных (атрибуты) и разрешенные операции над ней. Объектный тип Ч это лон, по которому можно создавать переменные, столбцы и другие конструкции этого типа. Объектный тип во многом похож на класс или абстрактный тип данных объект но-ориентированного программирования.

расширения в Объект это экземпляр объектного типа Объ екты могут храниться в таблицах (в таких случаях они явля ются постоянными), либо они могут существовать только временно в переменных PL/SQL.

Атрибут Ч это структурная часть объекта Oracle. Каж дый атрибут может принадлежать одному типу данных, либо скалярному, например либо составному, как пользователем вложенные таблицы или масси вы. К объявлениям атрибутов предъявлены следующие тре бования: не допускается указание ограничения NOT NULL, значений по умолчанию, типы данных должны соответство вать типам данных, которые используются при описании таб лиц и других объектов схем (за исключением LONG и LONG RAW). To есть нельзя объявить атрибут, например, типа BOOLEAN.

Метод Ч это процедура или функция, которая, как пра вило, производит операции над атрибутами объекта. Методы для объекта могут быть вызваны только в контексте конкрет ного объекта этого типа. Методы могут быть созданы на PL/SQL и других языках программирования. Для каждого объектного типа существует специальный метод по нию Ч так называемый конструктор, который инициализиру ет объекты. При определении объектного типа можно преду смотреть методы, которые будут являться членами объектно го типа. В определение типа входит только заголовок метода со спецификациями доступа к объектам базы Для определения тела метода необходимо определить тело типа (TYPE BODY), в котором определены тела всех методов. Оп ределению тела каждого метода должно предшествовать клю чевое слово MEMBER FUNCTION (MEMBER PROCEDURE).

Для доступа к атрибутам и методам в контексте экземпляра объекта в функции используется ключевое слово SELF. Для доступа к методам используется точечная нотация.

Конструкция "объявление очень похожа на конструкцию пакета". Работа с ними очень но, вместе с тем, имеется ряд различий. Так, для объектных типов нельзя использовать дополнительные программы, отсутствующие в объявлении типа.

Для сравнения объектов в определении объектного типа необходимо предусмотреть реализацию двух стандартных MAP и ORDER. Метод MAP не имеет аргументов и возвращает значение скалярного типа (DATE, NUMBER, CHAR, REAL). При сравнении двух объектов для каждого из них вычисляется значение этой функции, и объекты упорядочиваются в соответствии с этими значения ми.

Метод ORDER предоставляет пользователю несколько больше возможностей по определению внутренней логики оператора сравнения для данного объектного типа. Он ис пользует в качестве аргумента другой объект того же типа и возвращает или если собственный объект (объект, для которого вызывается данный метод) соответственно меньше, равен или больше объекта, переданного в качестве аргумента функции. Следует отметить, что тип может иметь только одну функцию MAP или ORDER.

Для создания объектных типов используется оператор CREATE TYPE. В следующем листинге приведен пример соз дания объектного типа, который имеет пять атрибутов и один метод.

CREATE OR REPLACE AS OBJECT 2 NUMBER, -4, 6 DATE, 7 MEMBER FUNCTION RETURN VARCHAR2, 8 MAP MEMBER FUNCTION M RETURN 9 / Type created.

233. Пример, иллюстрирующий создание объ ектного типа расширения в Код методов объектного типа создается при создании его тела. При создании самого типа они только объявляются, а реализуются с помощью оператора CREATE OBJECT TYPE BODY.

SQL> CREATE OR REPLACE. TYPE BODY IS 2 MEMBER FUNCTION RETURN AS 3 BEGIN 6 MAP MEMBER FUNCTION RETURN NUMBER AS 7 BEGIN 8 RETURN 10 END;

11 / Type body created.

Листинг Пример, иллюстрирующий создание тела объектного типа Для изменения или замены объектного типа используется оператор ALTER TYPE С его помощью, например, можно добавить новые методы или перекомпилировать тело объекта.

ALTER TYPE Otl REPLACE AS OBJECT NUMBER, 4 At DATE, 7 MEMBER FUNCTION AtlAt2At3 RETURN VARCHAR2, 8 MEMBER FUNCTION RETURN Type altered.

Листинг Пример, иллюстрирующий замену объ ектного типа с добавление нового метода '.. Х Для удаления объектного типа используется оператор DROP TYPE Если существуют объекты, завися щие от удаляемого объектного типа, то требуется указание ключевого слова FORCE. Удаление объектного типа представлено в листинге 236.

SQL> DROP TYPE Otl FORCE;

Type dropped.

x Листинг 236. Пример удаления объектного типа Если при объявлении двух типов используются взаимные ссылки объектов друг на друга или один из атрибутов типа ссылается на объект этого же типа, то объявить эти типы обычным способом не получится, так как в момент объявле ния одного типа второй будет еще не объявлен. Для таких объявлений используются неполные типы. В этом случае объ является заголовок что сообщает серверу Oracle, что такой тип существует и будет полностью определен позднее.

Рассмотрим пример создания такого типа.

CREATE OR REPLACE TYPE Type created.

SQL> CREATE OR REPLACE TYPE Ot2 AS OBJECT 2 NUMBER, 3 REF Type created.

Пример предварительного объявления типа расширения в Объекты в данных После определения можно использо вать как при определении столбца реляционной таблицы, так и при определении таблицы объектов. Объекты, хранящиеся в объектных таблицах, называются объектами в таблице. Объ екты, хранящиеся в столбце таблицы или как атрибут другого объекта, называются объектами в столбцах. Для их создания при описании нужно просто указать тип данных од ного из столбцов как соответствующий объектный тип. В дующем примере таблица содержит столбец At2, объявленный как объектный тип CREATE TABLE 2 NUMBER, 3 Otl);

Table created.

238. Пример создания таблицы, один из столбцов которой имеет объектный тип В общем случае объектный тип имеет древовидную структуру, в которой каждый атрибут объекта является вер шиной. Если же сам этот атрибут имеет объектный тип, то у него есть потомки. При таком построении каждое поддерево будет завершаться атрибутом встроенного типа или набором.

Такие атрибуты называются атрибутами-листьями объектного типа. В следующем примере для создания объекта используется поставляемая системой имя которой совпадает с именем объектного типа, а ее аргу менты имеют типы соответствующих атрибутов объектного типа в порядке их объявления при определении типа.

INSERT INTO ) 1 row created.

Листинг 239. Пример вставки записи с помощью функции-конструктора объекта Для выборки данных из этой таблицы необходимо объя вить для таблицы и в явном виде специфицировать ка ждый атрибут объекта.

SELECT FROM Tabl t 2 WHERE AT2.AT 10 A Листинг 240. Пример запроса к таблице, содержащей объекты в столбцах Наряду с хранением объектов в столбцах, можно исполь зовать таблицы объектов. Таблицы объектов Ч это специаль ный вид таблиц, содержащих объекты и обеспечивающих ре ляционное представление их атрибутов. Для следующего примера объектная таблица может рассматриваться двумя способами: таблица с одним столбцом, каждый эле мент которого объект типа ОН;

таблица с несколькими столбцами, каждый из которых имеет тип и имя соответст вующего атрибута объектного типа, то есть At2, At3, At4, At5. Для создания таблицы объектов используется следую щий упрощенный синтаксис:

CREATE TABLE ] OF имя объектного расширения в Пример создания объектной таблицы приведен в листин ге CREATE TABLE Tab2 OF Otl;

Table created.

Листинг Пример создания объектной таблицы Для вставки данных в объектную таблицу можно исполь зовать два способа Ч создать объект с помощью функции конструктора или перечислить атрибуты объекта явно во фра зе Пример вставки данных в объектную таблицу приведен ниже.

SQL> INSERT INTO Tab2 VALUES 1 row SQL> INSERT INTO Tab2 VALUES 1 row created.

Листинг 242. Пример различных способов вставки данных в объектную таблицу Выборку данных из объектной таблицы можно произво дить двумя способами: с помощью оператора VALUE (в дан ном случае использование обязательно) и с помощью спецификации атрибутов объектного типа. Примеры обоих способов приведены в листинге SELECT FROM Tab2 t sql.NEXTVAL FROM dual;

NEXTVAL INSERT INTO 2 VALUES 1 row created.

SQL> SELECT FROM Tab2 t 2 WHERE AT2, АТЗ, АТ4, OT1(63, Листинг 246. Пример создания триггера для ной таблицы Ссылки на объекты В реляционной модели данных для выражения ний между строками разных таблиц используются механизмы внешних ключей и поддержание ссылочной целостности. Для объектных расширений предусмотрен другой способ.

Для каждого объекта в таблице объектов Oracle создает уникальный и неизменный идентификатор Этот идентификатор позволяет обращаться к соответствующему объекту таблицы из другого объекта или реляционной табли цы. Гарантируется, что во всей базе данных нет пары объек тов с одинаковыми идентификаторами, также гарантируется повторное неиспользование идентификаторов удаляемых объектов. Встроенный тип данных, обеспечивающий возмож ность использования таких ссылок, называется REF. Пере менную типа REF можно использовать для доступа к объекту, как если бы данная переменная имела бы тот же тип, что и объект, на который она ссылается.

В в операторах INSERT и UPDATE используется конструкция RETURNING, которая позволяет без дополни Объектные в тельных перезапросов копировать в локальные переменные значения. В приведенном ниже листинге приведена техника работы с ссылками объекты (заносится объект в объектную таблицу с ссылкой на объект из объектной таблицы CREATE OR REPLACE TYPE AS OBJECT 4 BLOB, / Type created.

CREATE OR REPLACE TYPE Ot3 AS OBJECT 2 (Atl NUMBER, 3 REF / Type created.

SQL> CREATE TABLE Tab2 OF Table created.

Х SQL> CREATE TABLE OF Table SQL> DESC Name Null? Type NUMBER AT2 REF OF OT SQL> DECLARE 2 REF 3 BEGIN 4 INSERT INTO Tab2 t 6 RETURNING INTO 7 INSERT INTO VALUES 8 END;

.

9 / 16* I PL/SQL procedure successfully completed.

Пример работы с Очевидно, что для REF напрашивается прямая аналогия с ROWID, но есть и различия. не изменяется в течение жизни строки в таблице (если с базой данных не производятся специальные операции), а с переменными типа REF можно производить следующие действия: присваивать значение дру гой переменной типа REF;

устанавливать ее значение в NULL и т. п.

состоит из следующих частей: ROWID (при опреде лении атрибута таблицы, имеющего тип REF, необходимо указать WITH ROWID);

уникального идентификатора табли цы;

уникального идентификатора объекта. При объявлении переменной типа REF можно определить ее структуру (какие из перечисленных частей включать в нее, т. к. единственной обязательной частью REF является идентификатор объекта).

Когда сервер Oracle обращается к объекту, на который ссылается REF, он использует ROWID для выбора строки из таблицы. Если ссылка не содержит ROWID, то сервер ис пользует идентификатор таблицы и идентификатор объекта, по которым построены индексы.

Как следует из вышесказанного, REF является ссылкой на объект. Обратной функцией, которая позволяет по ссылке. обратиться к объекту, является DEREF. Пример работы с ней представлен в листинге 248.

SQL> DECLARE 2 REF 4 BEGIN Х 5 SELECT INTO 6 FROM Tab3 WHERE At 7 SELECT INTO в 8 FROM 10 END;

11 / A PL/SQL procedure successfully completed.

Листинг 248. Применение операции DEREF При определении атрибута таблицы, имеющего тип можно ограничить область действия ссылки, указав таблицу объектов, в которой хранятся объекты, на которые может ссылаться данная переменная. Такие ссылки называются ог раниченными. Они могут ссылаться только на объекты, хра нящиеся в специфицированной таблице. Если создать другую таблицу объектов того же типа, то данная переменная не сможет указывать на объект из новой таблицы. В ограничен ных ссылках не используются ROWID и идентификатор таб лицы (то есть они состоят только из идентификатора объек та). Так как при обращении к объекту по ограниченной ссылке сервер заранее знает таблицу, в которой хранятся объ екты, то доступ к объектам через такие ссылки осуществляет ся быстрее. Для работы с такими ссылками требуется приви легия на получение данных этой таблицы или системная привилегия SELECT ANY TABLE.

Следующий листинг демонстрирует изменение описания таблицы объектов SQL> ALTER TABLE 2 ADD (SCOPE FOR (At2) is.

Table altered.

Листинг 249. Пример указания таблицы, в хранятся объекты, с ограниченных ссылок.

Если в таблице объектов удалить объект, на который име ется то такая ссылка становится "зависшей". Для поиска таких ссылок используются запросы со специальными предикатами IS DANGLING. "Зависшие" ссылки не то ждественны пустым. Для проверки ссылки на "пустоту" ис пользуется стандартный предикат IS NULL. При попытке об ратиться к объекту по пустой или "зависшей" ссылке ошибки не произойдет, будет возвращено NULL-значение. Для иллюстрации вышесказанного приведем следующий пример:

DELETE FROM deleted.

SELECT FROM Tab3 WHERE IS NULL;

SQL> SELECT FROM ТаЬЗ 2 WHERE IS DANGLING;

Пример поиска зависших (DANGLING) и пустых (NULL) ссылок Массивы Другим способом для представления отношений между сущностями являются наборы объектов. поддержива ет два типа наборов. Они описывают набор данных, состоя щий из неопределенного числа записей одного типа. Соответ ствующие конструкции называются массивами переменной длины и вложенными таблицами (NESTED в TABLES). Наборы имеют конструкторы, представляющие собой функцию, имя которой совпадает с именем типа набо ра, а аргументами является некоторое число объектов.

' Массив Ч это упорядоченный набор данных одного типа.

Каждый элемент массива имеет индекс, который является числом, соответствующим элемента в массиве. Ко личество элементов массиве называется размером массива.

Массив имеет переменную длину. При объявлении массива необходимо указать его максимально возможный размер.

При проектировании базы данных рекомендуется вы брать если:

Ч важен порядок элементов в наборе (записи в массивах переменной длины упорядочены);

ограничение на количество элементов в на боре (при описании массива указывается его максимально возможный размер, что позволяет более эффективно хранить их по сравнению с вложенными таблицами, размер которых неограничен).

Для объявления массивов используется оператор CREATE TYPE следующего вида:

SQL> CREATE OR REPLACE TYPE 2 OF NUMBER;

3 / Type created.

Листинг Пример, иллюстрирующий объявление массива Можно объявить массив, элементы которого будут иметь скалярный тип, тип записи или объектный тип PL/SQL. Для элементов массива можно указать ограничение NOT NULL.

Создание массивов производится стандартным Ч с помощью конструктора, имя которого с именем типа, а обращение к элементам Ч с указанием индекса. Для увеличения размера массива служит метод EXTEND, однако увеличить размер массива так, чтобы он вышел за пределы, указанные при его объявлении, нельзя.

Также массивы можно использовать для объявления типа переменных в программах на PL/SQL.

SQL> DECLARE 2 TYPE IS OF 3 l_mass m;

BEGIN 5 1 mass 7 END;

/ ABC PL/SQL procedure successfully completed.

Листинг Пример, иллюстрирующий объявление массива Для определения актуального размера массива использу ется метод COUNT. В листинге 253 приведен пример созда ния таблицы, один из столбцов которой объявлен как массив, и функции, которая позволяет вывести в запросе все значения элементов массива через точку с запятой. Аналогичным обра зом можно определить и другие функции, например, для дос тупа к конкретному элементу набора по его индексу или по лучения актуального размера массива.

CREATE OR REPLACE TYPE AS OBJECT 3 At 4 / в Type CREATE TABLE Tab4 OF Table created.

SQL> INSERT INTO Tab4.

1 row SQL> INSERT INTO Tab 2 VALUES 1 row created.

SQL> CREATE OR REPLACE FUNCTION IN Tml) 2 RETURN AS 3 s 4 i INTEGER;

5 BEGIN 6 FOR i IN LOOP 7 s:=s| | 8 END LOOP;

9 RETURN 10 END;

Function created.

SELECT FROM A B. Листинг 253. Пример, иллюстрирующий обработку функцией массива в, С помощью операторов SQL с массивами в таблицах можно работать только целиком, модифицировать его от дельные элементы нельзя. То есть сначала необходимо счи тать значение массива в переменную такого же типа в про грамме на PL/SQL, изменить ее значение (значения элементов массива) и занести обратно в таблицу.

Вложенные таблицы Вложенная таблица Ч это неупорядоченный набор дан ных одного типа. Она имеет один столбец встроенного или определенного пользователем типа. Если этот столбец объ типа, то вложенная таблица может рассматриваться как многостолбцовая таблица со для каждого атри бута типа объекта. Работа с вложенными таблицами очень похожа на с PL/SQL таблицами. Работать с вложен ными таблицами можно как с динамическими переменными в программах на PL/SQL, а также хранить в базе данных. Далее будем рассматривать вложенные таблицы в базе данных.

При создании таблицы объектов необходимо указать таб лицу-хранилище для строк вложенной таблицы. Все вложен ные таблицы данной объектной или реляционной хранятся в таблице-хранилище. Для разных таблиц объектов необходимо использовать разные таблицы-хранилища. С точ ки зрения реализации отличие между длины и вложенными таблицами заключается в том, что дан ные вложенных таблиц хранятся в еще одной специальной таблице, а данные массивов хранятся в той же таблице. При мер создания таблицы, тип одного из столбцов которой объ явлен как вложенная таблица, приведен ниже. Для хранения вложенной таблицы используется таблица-хранилище Tab5 NESTED TABLE.

CREATE OR REPLACE TYPE Ot4 AS OBJECT 2 ( NUMBER, 3 At 4 / Type created.

CREATE OR REPLACE TYPE 2 AS TABLE OF 3 / Type created.

расширения в CREATE TABLE Tab 2 NUMBER, 4 NESTED TABLE 5 STORE AS Table created.

Листинг 254. объявления вложенной таблицы Инициализация вложенной таблицы производится с по мощью функции конструктора, имя которого совпадает с на званием таблицы.

С вложенными таблицами, хранящимися в базе данных, можно выполнять различные операции, как со всей таблицей, так и со строками. Порядок работы с родительской таблицей ничем не отличается от обычного, а для доступа к вложенным таблицам предназначены расширения, предусмотренные в реализации SQL. Первым из них является раскрывающий подзапрос (оператор позволяющий выбрать одну таб лицу, над которой будут производиться операции. Обязатель ным условием является единственность возвращаемой табли цы (запрос в предложении THE должен возвращать одну за пись, в противном случае будет получено сообщение об ошибке). Также раскрывающий подзапрос используется для вставки строк во вложенную таблицу, обновления данных в ней и удаления строк из нее. Проиллюстрируем технику вставки записей во вложенную таблицу на примере следую щего выражения INSERT. Здесь использован конструктор ти па После инициализации вложенной таблицы как значения столбца родительской таблицы можно обратиться к ней непо средственно.

INSERT INTO Tab5 VALUES 1 row created.

SQL> INSERT INTO 2 THE 3 (SELECT 2 FROM Tab5.t 4. WHERE VALUES row created.

INSERT INTO Tab5 VALUES 1 row created.

.

INSERT INTO 2 THE 3 FROM Tab5 t 4 WHERE t.Atl=10) VALUES (SELECT FROM Tab5 t * ERROR at line 3:

single-row returns more than one row Листинг 255. Пример вставки записей во вложенную таблицу, идентифицированную оператором THE Техника удаления и изменения данных во вложенных таблицах идентична и представлена в листинге 256.

SQL> UPDATE 2 THE 3 (SELECT FROM 4 WHERE 5 SET nt.At 1 row updated.

SQL> DELETE FROM 2 THE 3 (SELECT FROM Tab5 t 4 WHERE nt 5 WHERE 1 row deleted.

Листинг 256. Пример, изменение и удаление данных во вложенной таблице, идентифицированной выражением Объектные расширения в Другим способом доступа к вложенным таблицам явля ются вложенные курсоры (NESTED CURSORS). Вложенный курсор объявляется с помощью ключевого слова CURSOR в списке операндов оператора SELECT. Вложенные курсоры можно использовать только для выбора данных из таблицы.

Для вставки, удаления или обновления данных во вложенных таблицах их использовать нельзя. В приведенном в листин ге 257 запросе выражение возвращает курсор указатель (в открытом состоянии) для каждой После получения значения вложенного курсора его можно использовать аналогично обычным курсорам для доступа к строкам вложенной таблице.

SELECT CURSOR * 2 FROM TABLE FROM 10 CURSOR STATEMENT :

CURSOR STATEMENT AT 1 A 2 В Доступ к вложенной таблице с помощью вложенных курсоров Вложенные таблицы и массивы являются объектными типами и имеют методы. Некоторые из них уже были исполь зованы при иллюстрации работы с В таблице приведен полный список методов и выполняемых ими дейст вий. Методы используются при разработке программ PL/SQL, более подробно с их назначением и примерами можно в документации Oracle Application Developer's Guide.

Х Х Таблица Методы наборов Метод Описание EXISTS Определяет, существует ли некоторый элемент набора.

COUNT Возвращает число элементов набора.

LIMIT Возвращает максимальное число элементов набора.

FIRST/LAST Возвращает элемент набора.

Возвращает элемент набора, по отношению к данному элементу.

EXTEND Добавляет элементы к набору.

TRIM Удаляет элементы, начиная с конца набора.

DELETE Удаляет указанные элементы из набора.

Спецификации доступа Спецификации доступа Ч это директивы компилятора, запрещающие указанному методу доступ к объектам базы данных. Их аналогично назначению так называе мых "уровней чистоты" для пакетных функций PL/SQL, кото рые использовать в SQL-запросах об этом в разделе "PL/SQL Ч процедурное расшире ние языка SQL"). Спецификации доступа перечислены в таб лице Таблица 38. Спецификации доступа Директива Ограничения Данному методу запрещена модификация данных в таблицах (представлениях) базы данных.

расширения в Данному методу запрещена модификация пакетных переменных.

Данному методу запрещено чтение данных из таблиц и представлений базы данных.

Данному методу запрещено чтение значений переменных, хранимых в " пакетах.

Указание спецификаций доступа при определении заго ловка объектного типа позволяет потом не заботиться о том, что при определении тел методов в них будут совершены дей ствия, которые не являются при работе этих методов. Помимо некоторых моментов, связанных с реализа цией механизма методов объектов в сервере Oracle, это важно по следующим причинам.

Определять заголовок объектного типа и тела его мето дов могут разные пользователи. При определении специфи каций доступа не будет возможности осуществлять действия, создающие угрозу безопасности данным. Все запросы, испол нение которых производится во время метода, испол няются с привилегиями пользователя, тип, или пользователя, использовавшего данный тип (при применении динамического SQL). В дальнейшем Oracle планирует пре доставить возможность указания привилегий конкретного пользователя (создавшего метод или его вызвавшего).

В листинге 258 приведен пример попытки создания тела объектного типа с двумя методами, обладающими различны ми спецификациями функция не должна модифи цировать информацию из базы данных, а функция не должна читать данные из таблиц и представлений. Как следу ет из примера, на этапе компиляции обнаруживается, функция не соответствует своим ограничениям (осуществ ляет выборку данных из таблицы dual).

Раздел SQL> CREATE OR REPLACE TYPE Ot7 AS OBJECT 2 NUMBER, 3 DATE, 4 DATE, 5 MEMBER FUNCTION RETURN NUMBER, 6 MEMBER FUNCTION f2 IN NUMBER) RETURN 7 PRAGMA 8 PRAGMA RESTRICT_REFERENCES RNDS) -) 9. / Type created.

CREATE OR REPLACE TYPE BODY Ot7 IS 2 MEMBER FUNCTION RETURN NUMBER AS 3 BEGIN 4 RETURN 7 MEMBER FUNCTION f2 IN NUMBER) RETURN VARCHAR2 AS 8 1 NUMBER;

9 BEGIN 10 SELECT INTO 1 FROM dual;

/ Warning: Type Body created with compilation er rors.

SQL> show errors Errors for TYPE BODY ERROR 7/8 Subprogram violates its associated pragma Листинг Пример попытки создания тела объект ного типа, одна из функций которого наруша ет свою спецификацию доступа, '.

расширения в представления Объектные представления позволяют обращаться к дан ным из реляционных таблиц. Обычно они используются, если приложение не допускает изменения структуры таблиц и не обходимо организовать поддержку объектов в базе данных.

При создании объектного представления с помощью конст рукции WITH OBJECT OID указывается идентификатор объ екта. В следующем примере данные хранятся в реляционной таблице а объектное представление содержит один столбец предварительно созданного типа Ot5.

SQL> CREATE OR REPLACE TYPE Ot5 AS OBJECT 2 NUMBER, 4 / Type created.

CREATE TABLE 2 (Atl NUMBER, Table created.

SQL> OR REPLACE VIEW Ovl OF Ot 2 WITH OBJECT 3 AS SELECT FROM View created.

SQL> INSERT INTO VALUES 1 row created.

SQL> SELECT FROM Ovl v;

At2) OT5(1, Листинг 259. Пример, иллюстрирующий создание объ ектного над реляционной таб лицей и выборку объектов из него.

Важной особенностью является появление нового типа триггеров. Наряду с триггерами BEFORE и для реляционных таблиц, новый тип триггеров INSTEAD OF предназначен специально для объектных представлений. Этот триггер срабатывает при попытке модификации данных с ис пользованием объектного представления. В листинге представлен сценарий создания такого триггера и его сраба тывания при применении операторов модификации данных к объектному представлению SQL> CREATE OR REPLACE TRIGGER 2 INSTEAD OF INSERT ON Ovl 3 BEGIN INSERT INTO 6 / Trigger created.

SQL> INSERT INTO Ovl VALUES 1 row created.

Листинг 260. Пример, иллюстрирующий создание объ ектного представления и выборку объектов из Триггер срабатывает в вставки новой записи и обновляет связанную с объектным представлением реляци онную таблицу. С помощью этого вида триггеров для объект ных представлений разработчик может гибко реализовать не обходимую логику обновления объектно-реляционных дан ных.

Oracle 9i Как и любая фирма, разрабатывающая обеспечение, Oracle выпускает исправления (патчи) для те кущих релизов сервера баз данных и других продуктов и вре мя от времени (обычно с интервалом в несколько лет) представляет новые версии программ. В первой половине 2001 г. (официальное объявление широкой публике произошло в Англии в декабре 2000 г.) на рынке появилась версия Oracle 9i. Это событие можно рассматривать гораздо шире чем обычно, изменениям подвергся не один конкретный продукт, а все семейство. За словами Oracle 9i стоят две ключевые технологии: Oracle 9i Application Server и Oracle 9i Database.

Настоящая книга посвящена технологии баз данных Oracle и не включает описание инструментальных разработки, сервера приложений, комплексов анализа данных и т. п. Поэтому остановимся кратко на основных особенно стях Oracle Database.

В основном они связываются с хранилищами данных и аналитической обработкой информации. В состав Oracle 9i Database включены средства добычи данных (data mining), a так же средства извлечения, преобразования и загрузки (ETL) для хранилищ данных. Средства ETL предназначены для прямого обращения к внешним данным, к тексто вым файлам помощью обычных SQL-операторов.

Предполагаются и новшества другого порядка. Так, в Oracle 9i Database должна быть встроена поддержка возможности в реальном времени.

Назначение этой возможности связано с позиционированием сервера баз как платформы для электронной коммерции. посетителей Web-узла позволит выдавать им рекомендации, основываясь на индивидуальных профилях, хранимых в базе данных, и текущем поведении пользователей.

Нововведения затронули и Oracle.

SQL в 9i соответствует требованиям стандарта ANSI SQL99. В язык введено много новых синтаксических конст рукций. В SQL также появились новые типы данных, напри мер, тип TimeStamp дает возможность хранить в базе данных даты с точностью до долей секунды. Для аналитической об работки введены новые статистические функции, позволяю щие выполнять операции, ранее специфичные для OLAP например, вычислять параметры тренда или вы являть зависимость двух выборок значений случайных вели чин.

Изменения появились и в PL/SQL. В основном они кос нулись внутренней среды, обеспечивающей эффективное ис пользование ресурсов сервера для работы но появились и новые операторы, предназначенные, в частно сти, для работы с Сервер баз данных стал значительно интеллектуальнее.

Многие рутинные операции администрирования и конфигу рирования теперь выполняются автоматически или макси мально автоматизированы.

Применение Oracle 9i Database в электронной коммерции предъявляет повышенные требования к системе безопасно сти. Для демонстрации защищенности web-узла, построенно го на основе Oracle 9i, корпорация специально провела акцию "Неуязвимый Oracle", предложив атаковать свой сайт. Система виртуальных частных баз данных и про верка безопасности в контексте приложений предназначены для активно развивающейся бизнес-схемы сдачи приложений в аренду.

В завершение краткого изложения в духе "выше, дальше, быстрее" следует отметить, что основные положения техно Oracle, представленные в книге, останутся актуальны ми и для и для следующих релизов. Дело даже не в том, что авторам хочется, чтобы их книга была востребованной в те чении как можно большего времени, а в что уровень языковых средств и механизмов сервера более чем за 20 лет эксплуатации достиг в некотором смысле совершенства и вряд ли будет заметно меняться в дальнейшем. Например, вряд ли для генерации уникальных значений можно приду мать механизм, работающий удобнее последовательностей (sequence). Кроме того, существует огромное количество при ложений и баз данных, работающих под управлением млад ших версий Oracle, для которых в силу каких-либо причин не планируется переход на другие версии.

Также хочется отметить, что конкуренция на рынке кор поративных СУБД довольно велика и это обстоятельство иногда заставляет производителей в целях захвата новых сег ментов рынка, продвижения новых технологий и т. п. выпус кать не до конца доведенные версии программных продуктов.

Первый релиз сервера данных Oracle 9i ные ошибки (например, включение поддержки ANSI синтаксиса для внешних соединений привело к тому, что лю бой пользователь получает возможность просмотра данных из любой таблицы). Поэтому, как и для всего нового, требуется некоторое время для широкомасштабной обкатки Oracle 9i Database.

Всего же для подробного описания новых возможностей Oracle 9i потребуется несколько книг. Поэтому специалистам, желающим системно овладеть этими новыми, стремительно развивающимися технологиями в области баз данных, можно порекомендовать прослушать специально построенный набор курсов каком-либо авторизованном центре обучения Oracle в соответствии с выбранной для себя специализацией. В на стоящее время в этих центрах существуют программы подго товки администраторов, разработчиков приложений, проек тировщиков и аналитиков. Вместе с тем хочется отметить, что все без исключения наборы включают в себя подготовку по SQL, PL/SQL, разграничению доступа и архитектуре сер вера баз данных Oracle. Надеемся, что в изучении этой обяза тельной части вам поможет наша книга.

, ЯМ Заключение Перевернута последняя страница последнего раздела книги. Настала пора подвести некоторые итоги. Прежде все го, есть смысл оценить степень усвоения материала книги, проведя анализ степени достижения целей каждого раздела.

Основная задача, решаемая в первом разделе, дать об щее представление об архитектурах и компонентах распреде ленной системы обработки данных. Цель данного раздела достигнута, если у читателя сформировано четкое представ ление об архитектуре сервера Oracle, его основных возмож ностях, различных архитектурах информационных систем, организации локальных сетей, рассматриваемых как основа распределенных обработки данных, общих принципах конфигурирования сетевых средств Oracle, организации дос тупа к серверу базы данных.

Основная цель второго раздела Ч систематическое жение языка SQL. Читателя, успешно усвоившего темы вто рого раздела, характеризует умение создавать и изменять ос новные объекты Oracle и управлять данными.

Читателя, овладевшего материалом третьего раздела, от личает умение создавать и отлаживать прикладные програм мы на языке PL/SQL. Для эффективной разработки программ читатель получил сведения о стандартных пакетах, входящих в комплект поставки сервера.

Полученные в первых трех разделах теоретические пред ставления и навыки активно используются при обсуждении методов и средств доступа и аудита Oracle, рассмотренных в четвертом разделе.

Х Итогом изучения пятого раздела должно стать умение написать и интегрировать систему обработки данных при кладную программу на языке Java и построить апплет для обеспечения доступа к серверу баз данных на ос нове универсального клиента.

Шестой раздел должен сформировать понимание концеп ции и основных методов обеспечения целостности базы дан ных в условиях многопользовательского доступа и умение использовать соответствующие средства и утилиты Oracle.

Для углубления полученных знаний предназначен седь мой раздел о способах, повышающих скорость доступа к дан ным. Он должен предоставить знания, необходимые для эф фективного применения изученных языковых средств для ра боты большими и сверхбольшими базами данных.

Читатель, изучивший восьмой раздел, ознакомился с ос новным направлением развития технологий баз данных. Объектные расширения практически всеми поставщиками решений в этой и Oracle не исключение.

Что же делать дальше?

Во-первых, продолжать изучение литературы. В послед нее время вышло большое количество книг о современных технологиях обработки данных в системах промышленного уровня. Ряд издательств серии книг, предназна ченных для профессиональных разработчиков, проектиров щиков, администраторов, других специалистов, работающих с Oracle. Специальные серии ориентированы на начинающих пользователей. Издательство также планирует про должить публикации учебных материалов по технологиям и продуктам Oracle.

Во-вторых, для пополнения и совершенст вования своих знаний практически неограниченные инфор мационные ресурсы Internet. В настоящее время количество Web-серверов, содержащих информацию о технологиях и продуктах Oracle, постоянно увеличивается. Выходят элек тронные версии специализированных журналов. В различных конференциях и форумах можно задать интересующие вопро сы или найти готовые решения. Адреса некоторых Web ресурсов приведены ниже.

В-третьих, (в перечислении, но не по значимости) посто янно практиковаться в решении конкретных задач. Решение бесконечно многообразных и постоянно возникающих задач обработки информации есть не только способ зарабатывать на жизнь, но и источник Изящное решение сложных задач, которых множество в сфере обра ботки данных, может принести и приносит незабываемое эс тетическое наслаждение.

Нам же остается пожелать Вам успехов в освоении и по строении систем распределенной обработки информации на базе технологий Oracle.

Литература С. Архитектура. Ч М.: ЛОРИ, 2. Остин Д. Использование Ч СПб.: Вильяме, 1998.

3. Баженова И. Ю. Oracle 8/8i. Уроки программирования.

Диалог-МИФИ, 2000.

Урман С. Программирование на языке PL/SQL.

Ч Изд-во ЛОРИ,.

5. Кори М. Первое знакомство.

ЛОРИ, 1998.

6. Д., Стивенсон Oracle. Проектирование баз данных. Ч 1999.

7. Koch G., The complete Reference. Ч 1997.

8. Theriault M., W. Oracle Security. Ч O'Reilly&Associates, Inc., 1998.

Адреса основных серверов Internet, содержащих ин формацию о технологиях, Oracle и опыте их ис пользования.

Адрес в сети Internet Описание Web-сервера www.oracle.com Web-сервер корпорации Oracle Web-сервер журнала Oracle Magazine (RE) www.oracle.ru Web-сервер представительст ва корпорации Oracle в РФ www.fors.ru Web-сервер фирмы ФОРС (Москва) Web-сервер фирмы Ltd. (Москва) www.rdtex.ru Web-сервер фирмы (Москва) Содержание Азбука Oracle Предисловие ко второму изданию Благодарности Раздел 1. Архитектура распределенных систем обработки данных Средства обработки данных: эволюция идей и систем Эволюция реляционных СУБД на фоне истории Oracle Основные : Архитектуры обработки данных сети как среда передачи данных Эталонная модель взаимодействия открытых систем Компоненты распределенной системы и Конфигурирование компонент Oracle. Архитектура сервера Oracle Использование инструментального средства Информация о результатах операции Поддержка в Oracle Соглашения, принятые для описания Раздел 2. SQL Ч язык обработки данных Oracle Основные объекты Oracle Средства манипулирования данными языка SQL, Структура запроса Простейшие Формирование критерия Базовые средства определения критерия отбора Язык описания данных Oracle Типы данных Oracle Строки символов Числовые типы Битовые строки и время Таблицы. Представления. Пользователи Создание и удаление таблиц в Oracle Средства определения и уничтожения представлений Средства регистрации и исключения пользователей 4. Операция вставки строк... Операция удаления строк Операция модификации строк ;

Специальные предикаты Предикат IN Предикат BETWEEN Предикат LIKE Предикат IS NULL Предикат EXISTS Предикаты с кванторами ALL, ANY и SOME Теоретико-множественные операции Внешнее объединение Сортировка Иерархии Группирование и агрегатные функции Синтаксис языка запросов Связи с удаленными базами данных. Снимки данных Создание связей с удаленной базой данных Oracle Средства определения и уничтожения снимков Последовательности. Синонимы Создание последовательностей Создание синонимов в Oracle Работа с табличными областями в Oracle Раздел 3. Ч процедурное расширение языка Структура программы на PL/SQL Переменные, константы и Управление выполнением программы Оператор ветвления Операторы цикла Оператор GOTO Курсоры Обработка исключительных ситуаций Процедуры, функции и пакеты SQL-функции Oracle Функции, устанавливающие соответствие числовых кодов и символов Функции преобразования символов подстрок Символьные функции усечения и дополнения строк Символьные функции преобразования строк Функции, связанные с выделением подстрок Числовые функции, связанные с возведением в степень и логарифмированием Тригонометрические функции Числовые функции, связанные с округлениями Числовые функции, связанные со знаком числа Числовые функции, связанные с модулярной оперирующие с датами Функции преобразования типов данных Функции замены аргументов Справочные функции Создание пользовательских процедур и функций Пакеты ;

Триггеры базы данных Стандартные пакеты Oracle Динамический Файловый ввод-вывод..... Управление заданиями Управление LOB-объектами Управление многопользовательским доступом Использование функций PL/SQL в SQL-выражениях Раздел 4. Средства разграничения доступа в Oracle Анализ включающей инфраструктуры Идентификация Базовое понятие системы разграничения Предоставление системных привилегий Системные привилегии, определяющие права по работе с таблицами и представлениями Системные привилегии, определяющие права по работе с процедурами и триггерами. Системные привилегии, определяющие права по работе с пользователями Системные привилегии, определяющие права по работе с табличными областями Системные привилегии, определяющие права по работе с последовательностями... Системные привилегии, определяющие права по работе с синонимами Системные привилегии, определяющие права по выполнению глобальных действий в системе Системные привилегии, определяющие права по выполнению действий с остальными объектами БД... Использование конструкции PUBLIC и параметра WITH ADMIN OPTION,. Предоставление привилегий доступа к объекту Управление привилегиями с помощью ролей Системные привилегии, определяющие права по работе с Предопределенные роли в Oracle Создание ролей и предоставление им привилегий Управление допустимостью использования ролей Отмена привилегий Отмена системных привилегий и ролей Отмена привилегий доступа к Использование представлений для разграничения доступа Хранимые процедуры как средство разграничения доступа Использование триггеров для повышения защиты системы Средства аудита Аудит системных событий Аудит событий, связанных с доступом к объекту Прекращение регистрации событий Обработка данных аудита Профили пользователя как средство повышения защищенности системы Дополнительные Раздел 5. Создание приложений на языке Java Средства построения приложений и организации доступа к базам данных Создание приложений на языке Java Простейшее приложение на Java Простейший Выполнение SQL-операторов создания таблиц, ввода и модификации данных Простая выборка данных Параметрические запросы Хранимые процедуры на языке Java Раздел 6. Средства обеспечения целостности данных Определение транзакции и ее роль в СУБД Начало и окончание транзакции... Предложения SQL, управляющие транзакциями Предложение COMMIT WORK Использование предложения... Предложение ROLLBACK WORK Непротиворечивость и параллельная обработка Типы блокировок Ограничения целостности Массовая загрузка данных Экспорт/импорт данных Раздел 7. Методы повышения производительности Оптимизатор Ранжирование методов доступа Анализ запросов с целью повышения скорости их выполнения... Задание режима оптимизации Обзор индексов Oracle....... Эффективное кодирование SQL-выражений Изменение плана выполнения запроса Секционирование таблиц Секционирование индексов Операции с Раздел 8. Объектные расширения в Объектные типы Объекты в базе данных Ссылки на Массивы Вложенные таблицы Спецификации доступа Объектные представления '. Заключение....'. Литература Содержание Х Учебное издание Смирнов Сергей Николаевич, Задворьев Иван Сергеевич Работаем с Oracle Корректор Н.

ЛР № 066255 от АРВ. www.gelios-arv.ru 107014, Москва, Верхняя Красносельская, 16. Тел. (095)264-44-39, e-mail:

Формат 84x108/32. Бумага газетная. 15,5 п. л. Тираж 3 000 экз. Заказ № 1628.

Отпечатано с готовых диапозитивов в Чебоксарская типография № 1.

Адрес типографии: 428019, г. Чебоксары, пр. И. Яковлева, 15.

Pages:     | 1 |   ...   | 3 | 4 | 5 |    Книги, научные публикации