Академический Документы
Профессиональный Документы
Культура Документы
Задворьев
Учебное пособие
2-е издание
исправленное и дополненное
Москва
"Гелиос АРВ'
2002
УДК 681.3.06
ББК 32.973.2
С 57
УДК 681.3.06
ББК 32.973.2
В.А. Минаев,
доктор технических наук, профессор, академик РАЕН
Предисловие
ко второму изданию
Повсеместное распространение персональных компьюте-
ров и ориентированных на персональные компьютеры
средств обработки данных привело к тому, что для широкого
круга пользователей проблематика систем обработки данных
промышленного масштаба оказалась недоступной. Следстви-
ем ситуации явилось широкое распространение неверного
мнения, что система обработки данных, хорошо зарекомендо-
вавшая себя для персонального применения или применения
в небольшой группе, будет хорошо работать и в масштабе
отдела или предприятия в целом. Другое распространенное
заблуждение состоит в том, что при существенном увеличе-
нии объемов обрабатываемых данных можно обеспечить
приемлемые характеристики большой системы прямым на-
ращиванием мощности компьютеров.
Всякая абстрактная идея лучше всего воспринимается то-
гда, когда она иллюстрируется конкретным примером. Выбор
конкретной СУБД для иллюстрации изложения во многом
определяется вкусом авторов. Действительно, сервер OracleS
является наиболее интересным и функционально богатым
продуктом на современном рынке. Это мнение, видимо, раз-
деляют и коллективы, обеспечившие разработку и поддержку
большого числа крупномасштабных банковских систем и ин-
формационных систем больших предприятий. В то же время в
любой СУБД, поддерживающей распределенную обработку
данных, читатель легко найдет практически совпадающий
спектр проектных решений.
Цель данной-книги состоит в достаточно общем описании
концепции построения и возможностей СУБД Oracle. При
этом сервер Oracle рассматривается как ядро распределенной
многопользовательской системы обработки данных.
Второе издание книги существенно переработано. Замет-
но увеличился объем представленного материала. Тем не ме-
8
Предисловие
11
Предисловие
Благодарности
Авторы выражают признательность за помощь в написа-
нии книги Сергею Саенко, Александру Знобищеву, Сергею
"Джихаду" Кургузову и Ольге Соколовой, а также благодарят
за оказанную техническую поддержку Валерия Чашкина и
Анатолия Моргунова.
Раздел 1
АРХИТЕКТУРА
РАСПРЕДЕЛЕННЫХ
СИСТЕМ ОБРАБОТКИ
ДАННЫХ
'13
'i
Раздел 1
14
Архитектура распределенных систем обработки данных
16
Архитектура распределенных систем обработки данных
Эволюция реляционных
СУБД на фоне истории Oracle
Около двадцати лет назад молодые сотрудники неболь-
шой американской консалтинговой фирмы Ларри Эллисон,
Роберт Майнер и Эдвард Оутс решили открыть собственное
дело для создания коммерческой реляционной СУБД. За пять
лет, прошедших с момента первых публикаций классиков Э.
Ф. Кодда и К. Дж. Дэйта, идеи реляционных систем прочно
завоевали место в теоретических и экспериментальных ис-
следованиях в области автоматизированных систем обработ-
ки данных. Серия публикаций в научно-исследовательском
журнале фирмы IBM, в которых описывались проект реляци-
онной системы управления базами данных "System R" и язык
запросов SEQUEL2, привела к переводу проблемы в практи-
ческую плоскость.
Основной целью созданной тремя программистами фир-
мы Relational Software Incorporated была реализация перено-
симой реляционной системы управления базами данных с
поддержкой базового языка обработки данных SQL (Structure
Query Language — структурированный язык запросов). За два
года поставленная задача была решена.
В 1979 г. заказчикам была представлена версия СУБД для
мини-компьютеров PDP-11 фирмы Digital Equipment
Corporation сразу для нескольких ОС: RSX-11, IAS, RSTS и
UNIX. Чуть позже система была перенесена на компьютеры
VAX под управлением VAX VMS. Значительная часть кода
была написана на ассемблере, и поэтому процесс переноса
системы на новую платформу требовал значительных усилий.
Основным отличием СУБД очередной, третьей версии,
было то, что она была полностью написана на языке Си. Та-
кое решение обеспечивало переносимость системы на многие
новые платформы, в частности на различные клоны UNIX.
18
Архитектура распределенных систем обработки данных
21
Архитектура распределенных систем обработки данных
26
Архитектура распределенных систем обработки данных
27
Раздел 1
29
Раздел 1
а серверы приложений выполняют все вычисления, связанные
с реализацией безнес-логики приложениями.
Аналогично технологии "клиент-сервер" дадим ряд опре-
делений, существенных для описания многозвенной архитек-
туры. В ее состав входит универсальный клиент — определим
его как процесс, посылающий запрос на обслуживание и спо-
собный осуществить отображение его результатов на основе
некоторого универсального протокола выдачи информации.
Основное отличие универсальных клиентов от обычных —
способность предоставления пользователю интерфейса для
решения любых задач, низкая стоимость внедрения, админи-
стрирования и поддержки. Как правило, это браузер, про-
грамма просмотра сценариев на каком-либо языке разметки.
Браузер может поддерживать с помощью run-time расшире-
ний и другие форматы файлов. Приложения, используемые в
качестве таких расширений, хранят все свои файлы на клиен-
те. Когда браузер встречает вызов такого расширения, он за-
гружает соответствующие исполнимые файлы и запускает
приложение.
Сервер баз данных -— это логический процесс, отвечаю-
щий за обработку запросов к базе данных. Сервер приложе-
ний — совокупность логических процессов, реализующих
бизнес-логику на основании данных, предоставляемых серве-
ром баз данных и передающих результаты вычислений уни-
версальному клиенту через некоторую среду передачи дан-
ных. Администрирование и обслуживание приложений осу-
ществляются полностью на сервере приложений, а не на сто-
роне клиента, поэтому обновлять программные модули уни-
версального клиента (браузера) приходится довольно редко.
Основными экономическими преимуществами данной архи-
тектуры являются:
— относительно низкие затраты на внедрение и эксплуа-
тацию;
— высокая способность к интеграции существующих
информационных ресурсов;
30
Архитектура распределенных систем обработки данных
31
Раздел 1
Эталонная модель
взаимодействия открытых систем
Необходимость осмысления и управления сложными и
многообразными функциями, осуществляемыми различными
элементами вычислительной сети, привела к созданию кон-
цепции многоуровневого взаимодействия. Разделенные на
иерархически упорядоченные группы, несколько функцио-
нальных слоев, называемых уровнями, выполняют опреде-
ленную логическую функцию. При этом для элементов более
высокого уровня предоставляется определенный перечень
услуг.
С целью установления единых правил взаимодействия
вычислительных систем различных фирм-производителей,
Международной организацией стандартов (ISO — Inter-
national Standards Organization) в 1978 г. выпущен набор спе-
цификаций, описывающих структуру неоднородной сети. В
1984 г. на базе спецификаций неоднородной сети была при-
нята и рекомендована к использованию эталонная модель
взаимодействия открытых систем (QSI — Open System
Interconnection Reference Model). Данная модель является ме-
ждународным стандартом, описывающим взаимодействие
программных, и аппаратных компонент при организации ра-
боты компьютеров в сети.
Эталонная модель взаимодействия открытых систем
(ЭМВОС) определяет стандарты соединения и взаимодейст-
35
2*
Раздел 1
37
Раздел 1
39
Раздел 1
40
Архитектура распределенных систем обработки данных
Компоненты распределенной
системы и ЭМВОС
Четыре нижних уровня ЭМВОС — физический, каналь-
ный, сетевой и транспортный — обеспечиваются аппаратурой
и средствами операционной системы. Для того чтобы создать
распределенную систему обработки данных, необходимо соз-
дать ее сетевую основу. Поясним этот этап на примере ло-
кальной вычислительной сети.
Самый нижний уровень — передающая система сети.
Система передачи предназначена для передачи сигналов ме-
жду компьютерами и обычно поддерживает только ограни-
ченный диапазон. Система также ограничивает типы физиче-
ских соединений с сетевыми адаптерами серверов и рабочих
станций.
Компьютеры, на которых будут установлены элементы
распределенной системы, должны быть оборудованы сетевы-
ми адаптерами, которые должны быть присоединены к среде
передачи данных, например витой паре или коаксиальному
кабелю. Среда, передачи данных с дополнительными устрой-
ствами (концевыми заглушками-терминаторами, повторите-
лями сигналов и т. п.) и сетевые адаптеры образуют физиче-
ский уровень передачи данных.
Для правильной интеграции сетевого адаптера в операци-
онную систему должен быть настроен драйвер сетевой карты.
Многие сетевые адаптеры распознаются и настраиваются
средствами операционной системы, но в некоторых случаях
потребуется установка программного обеспечения от фирмы-
41
'"
Раздел 1
производителя. После конфигурации программного обеспе-
чения сетевого адаптера необходимо определить используе-
мый сетевой протокол. Один адаптер может поддерживать
передачу данных по нескольким протоколам.
Используемый протокол определяет способ задания сете-
вого адреса. Каждый узел в сети должен иметь свой уникаль-
ный сетевой адрес. При создании распределенных систем на
базе Oracle чаще всего используется протокол ТСРЛР. Для
систем UNIX это — стандартный телекоммуникационный
протокол. Для Windows поддержка этого протокола встроена
в операционную систему.
Таким образом, первым шагом создания распределенной
системы обработки данных является правильное конфигури-
рование параметров сетевого адаптера, операционной систе-
мы и проверка работоспособности сетевого транспорта. Пра-
вильное конфигурирование и работоспособность сетевого
транспорта являются необходимыми условиями создания
распределенной системы обработки данных. Проверку функ-
ционирования транспорта можно выполнить программами
диагностики сети, например, утилитой ping. В листинге 1
приведен пример проверки функционирования сетевого
транспорта к компьютеру, имеющему сетевое имя ora_server.
C:\ping ora_server
Pinging ora_server [192.147.0.2] with 32 bytes of
data:
Reply from 1 9 2 . 1 4 7 . 0 . 2 : bytes=32 time=2ms TTL-128
Конфигурирование сетевых
компонент Oracle
Для настройки Net8 Oracle предоставляет специализиро-
ванные средства с графическим интерфейсом, например Net8
Easy Config. Тем не менее дадим некоторые общие сведения,
поясняющие суть процесса конфигурирования. Начнем с сер-
вера баз данных. Каждый сервер обладает именем. Имя сер-
вера относится к физической машине, на которой находится
база данных Oracle. В сети каждый сервер имеет свой кон-
кретный, уникальный адрес. Обратиться к серверу можно по
имени или по сетевому адресу. Для идентификации базы дан-
ных на сервере служит имя сервиса. Имя сервиса — это стро-
ковая переменная, включающая название базы данных и до-
мен. По умолчанию Oracle использует типовой домен .world.
Чтобы взаимодействие с сервером Oracle было возмож-
ным, на сетевом узле, где находится сервер баз данных, дол-
43
Раздел 1
жен быть запущен, как минимум, один прослушивающий
процесс. После его запуска, независимо от того, как он был
запущен, появляется возможность приема входящих запро-
сов, их обработки, а в случае разъединения сохраняется
возможность поддержки других соединений.
При запуске прослушивающий процесс считывает необ-
ходимую ему управляющую информацию из специального
файла параметров. Место расположения этого файла зависит
от операционной системы, его имя, как правило, listener.ora.
Чаще всего этот файл расположен в каталоге
$ORACLE_HOME/NETWORK/ADMIN (UNIX) или
%ORACLE_HOME\NET8\ADMIN (Windows), где переменная
ORACLE_HOME задает конкретный путь (например,
D:\ORANT). Упрощенный вариант файла listener.ora пред-
ставлен в листинге 2.
LISTENER_EDUC =
(ADDRESS_LIST =
(ADDRESS =
(PROTOCOL = TCP)
(Host = ora_server)
(Port = 1521) )
STARTUP_WAIT_TIME_LISTENER_EDUC = 0
CONNECT_TIMEOUT_LISTENER_EDUC = 10
TRACE_LEVEL_LISTENER_EDUC = ADMIN
SID_LIST_LISTENER_EDUC =
(SID_LIST =
(SID_DESC =
(SID_NAME = EDUC)))
D:\ORANT\BIN>lsnrctl
LSNRCTL for 32-bit Windows: Version 8 . 1 . 5 . 0 . 0 -
Production on 04-FEB-02 19:12:18
(c) .Copyright 1998 Oracle Corporation. All
rights reserved.
Welcome to LSNRCTL, type "help" for information.
LSNRCTL> start
System parameter f i l e is
D:\0rant\net8\admin\listener.ora
.Listening on:
(ADDRESS=(PROTOCOL=TCP)(Host=ora_server)
(Port=1521))
STATUS of the LISTENER
45
Раздел 1
Alias LISTENER
Version TNSLSNR for 32-bit Windows: Version
8 . 1 . 5 . 0 . 0 - Production
Start Date 04-FEB-02 19:18:01
Uptime 0 days 0 hr. 0 min. 2 sec.
Trace Level off
Security ON
SNMP OFF
Listener Parameter File System parameter f i l e is~
D:\0rant\net8\admin\listener.ora
Services Summary...
EDUC has 1 service h a n d l e r ( s )
The command completed successfully
ORA8EDUC.WORLD =
(DESCRIPTION =
46
Архитектура распределенных систем обработки данных
(ADDRESS_LIST =
(ADDRESS =
(PROTOCOL = TCP)
(Host = ora_server)
(Port = 1521}))
(CONNECT_DATA = (SID = EDUCJ))
51
Раздел 1
.
Раадел 1
Connected by:
OracleS Enterprise. Edition, Release 8.0.5.0.0 -
Production
With the Objects option
PL/SQL Release 8.0.5.1.0 - Production
SQL>
55
Раздел 1
USER
Ul
SQL> LIST
1* SELECT USER FROM dual ,
08-04-2002
-.
Раздел 1
SAVE имя_файла
SAVE имя_файла REPLACE
EDIT имя_файла
GET имя_файла
X '
10
Информация о результатах
операции
Выполнение какой-либо операции клиентского приложе-
ния или оператора SQL на сервере может завершиться с раз-
личными итогами. Успешность завершения операции опреде-
ляется значениями возвращаемых ею параметров, характери-
зующих итог выполнения операции, *ши сообщениями об
ошибках. Сообщения об ошибках специфичны для различных
продуктов Oracle. Во всех сообщениях об ошибках указыва-
ется префикс, указывающий на то, какое приложение выдает
ошибку. Например, префикс IMP указывает на то, что ошибка
произошла при импорте данных с использованием утилиты
импорта.
Для сервера Oracle ошибки имеют префикс ORA, а соот-
ветствующие параметры передаются в форме двух кодов за-
вершения: SQLCODE, SQLERRM. Значение SQLERRM со-
держит развернутое текстовое сообщение об ошибке с указа-
нием ее причин. Пятисимвольное значение параметра
SQLCODE определяется международным стандартом, фор-
мируемым Международной организацией стандартизации
(ISO). Нулевое значение параметра свидетельствует об ус-
пешном завершении операции, отрицательные значения соот-
ветствуют завершению операции с некоторой ошибкой, л по-
ложительные — завершению с предупреждением о возмож-
ной ошибке или предназначены для передачи параметров,
характеризующих особенности завершения операции (напри-
мер, отсутствие данных, удовлетворяющих критерию запро-
са).
Таким образом, это — две различные формы представле-
ния информации, характеризующей успешность завершения
оператора языка SQL.
Для облегчения поиска причин ошибок и их исправления
в сообщениях об ошибках указываются имена объектов, при
60
Архитектура распределенных систем обработки данных
Поддержка мультиязычности
в Oracle
Для корректной работы приложений с русским языком
требуется специальная настройка. Поддержка национальных
языков Oracle (National Language Support — NLS) позволяет
взаимодействовать с сервером на различных языках, поддер-
живая различные схемы кодирования символов. Oracle под-
держивает как однобайтовые, так и мультибайтовые схемы.
Поскольку зависящие от языка данные хранятся отдельно от
обрабатывающего их кода, можно легко добавлять новые
языки и зависящие от языка средства, не изменяя приложе-
ний. Символьный набор, который будет использоваться для
хранения данных в базе, определяется при ее создании. На-
стройке также подлежат язык вывода сервером информаци-
онных сообщений, чисел, дат и т. д.
Для конфигурирования NLS предназначены параметры.
NLSJLANGUAGE и NLSJTERRITORY. Они определяют ис-
пользуемый по умолчанию формат дат, чисел и других
свойств обработки данных. Просмотреть текущие значения
параметров NLS можно в системном представлении
V$NLS_PARAMETERS, а изменить оператором ALTER
SYSTEM (ALTER SESSION). Изменение параметров NLS
также можно осуществить на уровне сессии или даже одного
оператора.
62
Архитектура распределенных систем обработки данных
63
Раздел 1
ИЛИ
64
Архитектура распределенных систем обработки данных
Соглашения, принятые
для описания команд
В книге используются приведенные ниже соглашения для
представления синтаксиса команд.
65
3. Заказ № 1628.
Раздел 2
SQL — ЯЗЫК
ОБРАБОТКИ ДАННЫХ
ORACLE
66
SQL — язык обработки данных Oracle
67
Раздел 2
68
SQL — язык обработки данных Oracle
69
Раздел 2
71
Раздел 2
72
SQL — язык обработки данных Oracle
Средства манипулирования
данными языка SQL
В языке SQL предусмотрено четыре ключевых слова для
операций манипулирования данными: SELECT, INSERT,
UPDATE и DELETE. Предложения с оператором SELECT
занимают особое место, поскольку они предназначены для
выборки данных, а основная часть активности пользователей
связана с выполнением запросов на выборку данных. Кроме
того, умение правильно и оптимально написать сложный за-
прос является одной из лучших характеристик квалифициро-
ванного специалиста в области систем управления базами
73
Раздел 2
74
SQL — язык обработки данных Oracle
ATI AT2
A 1
В 2
С 2
ATI AT2
A 1
В 2
С 2
75
Раздел 2
AT2 ATI
1 A •
2 В
2 С
.1 ATI = A
.2 ATI = В
.2 ATI = С
AT2
1
2
2
AT 2
1
2
77
Раздел 2
подзапроса должен быть таким, как если бы каждый под-
запрос действительно вычислялся заново для каждой строки
R, хотя реально это обычно не требуется.
В качестве базовой конструкции для формирования кри-
терия отбора часто используется совокупность двухместных
предикатов, соединенных логическими связками. Язык SQL
поддерживает двухместные предикаты с операциями:
= Равно
> Больше чем
< Меньше чем
>= Больше или равно
<= Меньше или равно
!=, о Не равно
ATI AT2
В 2
С 2
Операция Результат
TRUE AND UNKNOWN UNKNOWN
FALSE AND UNKNOWN FALSE
UNKNOWN AND UNKNOWN UNKNOWN
TRUE OR UNKNOWN TRUE
FALSE OR UNKNOWN UNKNOWN
UNKNOWN OR UNKNOWN UNKNOWN
NOT UNKNOWN UNKNOWN
79
Раздел 2
ATI AT2
A 1
В 2
С 2
80
SQL — язык обработки данных Oracle
1/0=1
*
error at line 2:
ORA-01476: divisor is equal to zero
81
Раздел 2,
83
Раздел 2
84
SQL — язык обработки данных Oracle
Определение Представление
при выполнении действий
NUMBER 123456
NUMBER(7,1) 123456.7
NUMBER(5,2) ошибка в данных
NUMBER(8,3) 123456.789
NUMBER(7,-2) 123500
85
.
Раздел 2
ROWID
AAADFlAADAAAGnPABX
86.
SQL — язык обработки данных Oracle
SQL> INSERT'INTO таы VALUES(i,2);
1 row created.
SQL> DELETE FROM Tab!
2 WHERE ROWID NOT IN (SELECT MIN(ROWID)
3 FROM Tabl
4 GROUP BY Atl,At2)
5 /
1 row deleted.
Битовые строки
Тип RAW [Только для Oracle] используется для хранения
двоичных строк переменной длины. Отличие типа RAW от
типов CHAR, VARCHAR2 состоит в том, что для типов сим-
вольных строк Oracle производит автоматическое преобразо-
вание данных при их передаче между клиентом и сервером.
Утилиты Import и Export также производят автоматическое
преобразование символьных строк при логической разгрузке
и загрузке баз данных в соответствии с настройками средств
поддержки национальных языков. Oracle выдает данные типа
RAW в шестнадцатеричном виде.
Синтаксис: RAW [(длина)]. Параметр длина измеряет-
ся в байтах. Максимальное значение параметра длина — 2000
байт.
Пример
bitarrayl R A W ( 1 0 )
87
Раздел 2
Пример
verylongstrl LONG RAW(1000000)
Дата и время
Тип DATE [Только для Oracle] используется для хране-
ния даты и времени. Допускаются даты с 1 января 4712 г. до
н.э. до 31 декабря 4712 г. н.э. Для формирования значения
типа DATE в SQL и PL/SQL обычно используется встроенная
функция ТО_ОАТЕ('сгшвольная_строка_даты', 'фор-
мат_даты *). При определении даты без уточнения времени
по умолчанию принимается время полуночи. Функция
SYSDATE возвращает текущее значение даты и времени.
Значение функции определяется средствами операционной
системы компьютера, на котором работает сервер Oracle.
Синтаксис: DATE.
Пример
birthday DATE
SYSDATE
16-04-2002
SYSD+10
26-04-2002
88
SQL — язык обработки данных Oracle
SQL> SELECT SYSDATE-10 "sysd-10" FROM dual;
SYSD-10
06-04-2002
JDATE
2452276
89
Раздел 2
LOB-объекты
Тип BLOB [Только для Oracle] используется для хране-
ния двоичных данных размером до 4 гигабайт. Для работы с
большими двоичными объектами используется стандартный
пакет DBMS_LOB, о котором рассказывается в разделе
"PL/SQL — процедурное расширение языка SQL".
Синтаксис: BLOB.
Пример
doc BLOB
90
SQL — язык обработки данных Oracle
Таблицы. Представления.
Пользователи
Создание и удаление таблиц
в Oracle
Таблица является базовой структурой реляционной моде-
ли. Как известно, вся основная информация реляционной ба-
зы данных хранится в таблицах. Таблицы состоят из множе-
ства поименованных столбцов. Множество допустимых зна-
чений столбца может быть уточнено с помощью ограничений
целостности.
Оператор определения таблиц Oracle содержит довольно
большое число ключевых слов и параметров. Рассмотрим со-
кращенное множество конструкций. Полный синтаксис опе-
ратора CREATE TABLE может быть получен из соответст-
вующего раздела документации OracleS SQL Reference.
94
SQL — язык обработки данных Oracle
Средства определения
и уничтожения представлений
Представление — это поименованная, динамически под-
держиваемая сервером выборка из одной или нескольких таб-
лиц или других представлений. Оператор SELECT, опреде-
ляющий выборку, ограничивает видимые пользователем дан-
ные. Кроме того, представление позволяет эффективно огра-
ничить данные, которые пользователь может модифициро-
вать. Используя представления, администратор базы данных
ограничивает доступную пользователям часть логического
пространства базы данных только теми данными, которые
реально им необходимы. Оператор определения представле-
ний Oracle использует следующий синтаксис:
97
4. Заказ М» 1628.
Раздел 2
99
Раздел 2
View created.
100
— язык обработки данных Oracle
SQL> CONNECT u2/u2psw@educ;
Connected.
ATI AT2
2 3
SAT1 AVGAT2
5 2.67
Средства регистрации
и исключения пользователей
Пользователь — это объект Oracle, который может вы-
полнять предусмотренные действия с объектами Oracle в со-
ответствии с поддерживаемой технологией.
Оператор определения пользователей Oracle использует
следующий синтаксис:
105
Раздел 2
106
SQL — язык обработки данных Oracle
108
SQL — язык обработки данных Oracle
109
Раздел 2
DELETE [FROM]
{ [имя_схемы. ] { имя_,таблицы | имя_представления }
[@имя_связиБД ] | подзапрос }
[ альтернативное_имя] [WHERE условие ]
110
— язык обработки данных Oracle
ill
Раздел 2
ATI AT2
1 AAA
2 BBB
ATI AT2
1 CCC
2 BBB
1 . CCC
3 BBB
112
SQL — язык обработки данных Oracle
Предикат IN
113
Раздел 2
ATI AT2
A 1
С 3
ATI AT2
В 2
С 3
114
SQL — язык обработки данных Oracle
Предикат BETWEEN ::= выражение [NOT]
BETWEEN начальное_значение AND конечное_значение
01-01-2002 1 11-04-2002-
ATI AT2
01-01-2002 1
115
Раздел 2
01-07-2002 3
Предикат LIKE
Предикат LIKE применим только к полям типа CHAR,
VARCHAR и VARCHAR2. Предикат принимает истинное
значение при вхождении определенной подстроки в строку. В
качестве механизма формирования условия используется
шаблон, состоящий из специальных символов и обычных
символов используемой кодировки. В роли специальных сим-
волов выступают:
символ подчеркивания (_), замещающий любой одиноч-
ный символ;
символ процента (%), замещающий последовательность
любого числа символов (включая пустой символ).
Например, на шаблоне 'А_' предикат LIKE принимает
истинное значение для всех двухсимвольных значения атри-
бутов, первый из которых символ 'А', а на шаблоне 'А%'
предикат LIKE принимает истинное значение для всех значе-
ния атрибутов, первый из которых символ 'А', а длина произ-
вольна. Если ограничение накладывается на значения индек-
сированного столбца, а шаблон начинается со специального
116
SQL — язык обработки данных Oracle
ATI
AB
ABC
ACB
ADC
ATI
AB
117
Раздел 2
АСВ
CAB
ATI
ACB
ATI
ABC
ADC
Предикат IS NULL
Распространенной является ситуация, когда в некоторых
записях таблицы присутствуют атрибуты с неопределенными
значениями, например, потому что значение атрибута не было
введено. В языке SQL для указания неопределенного значе-
ния атрибута используется значение NULL. Когда значение
атрибута есть NULL, подразумевается, что атрибут не принял
никакого конкретного значения. Значение NULL поддержи-
вается специальным образом и не имеет какого-либо типа
данных. Атрибут с любым типом данных может иметь значе-
ние NULL.
Для OracleS (а также младших версий) для символьных
значений переменной длины значения " и NULL эквивалент-
ны. Это же верно для типов CHAR, VARCHAR, VARCHAR2,
RAW, LONG RAW, LONG, DATE, ROWID, BLOB, CLOB,
MLSLABEL.
Выражение типа Atl = NULL или Atl IN (NULL) будет
иметь неопределенное значение, независимо от значения Atl.
118
SQL — язык обработки данных Oracle
В .
119
•
Раздел 2
ATI AT2
A 1
Предикат EXISTS
Предикат EXISTS принимает истинное значение, если не
пуст результат некоторого подзапроса. Предикат EXISTS мо-
жет вычисляться автономно или в комбинации с другими
предикатами, соединенными логическими связками. Данный
предикат не может принимать неопределенного значения, то
есть его значением всегда является TRUE или FALSE. Значе-
ние равно TRUE тогда и только тогда, когда результат вычис-
ления подзапроса не пуст.
Предикат EXIST использует следующий синтаксис:
120
SQL — язык обработки данных Oracle
ATI AT2
В 2
121
Раздел 2
Теоретике-множественные
операции
Теоретико-множественные операции объединяют резуль-
таты многокомпонентного запроса в единый результат.
122
SQL — язык обработки данных Oracle
ATI
I
2
3
5
ATI
1
2
3
1
3
5
124
SQL — язык обработки данных Oracle
ATI
1
3
ATI
2
Листинг 46. Примеры использования теоретико-
множественных операций в запросах
Внешнее объединение
Прежде чем обсуждать внешнее объединение, рассмот-
рим простое объединение (simple join). Если при выполнении
выборки не используется ключевое слово WHERE, то
результатом является декартово произведение таблиц,
снимков или представлений, участвующих в выборке.
Обычно комбинировать все строки одной таблицы со всеми
строками другой не требуется, поэтому используется
критерий отбора, определяемый ключевым словом WHERE.
Такое объединение называется простым.
Проиллюстрируем технику выполнения операций декар-
това произведения и простого объединения на таблицах, соз-
данных и заполненных предложениями:
125
Раздел 2
1A l a
2В l a
3С l a
1 A 3 b
2 В 3 b
3 С 3 b
1 A 5 с
2 В 5 с
3С . 5 с
9 rows selected.
1 A l a
3 С 3 b
126
SQL — язык обработки данных Oracle
ATI A ATI A
1 A l a
2 В
3 С 3 b
ATI A ATI A
1 А 1 а
з• С 3 b
5 с -
127
Раздел 2
Сортировка
Для сортировки результатов запроса по возрастанию или
убыванию используется ключевое слово ORDER BY. Без ука-
зания этого ключевого слова строки извлекаются в произ-
вольном порядке.
Сортировка задается использованием следующей синтак-
сической конструкции:
128
SQL — язык обработки данных Oracle
AT1*10 AT2
10
10 A
20 В
30 С
30 A
Иерархии
Выдача данных на основании их иерархической упоря-
доченности осуществляется с использованием ключевых слов
CONNECT BY и START WITH. Ключевое слово CONNECT
BY определяет структуру иерархической связи. CONNECT
BY определяет как строки, выбираемые в иерархическом по-
рядке, так и отношение, используемое для объединения строк
в иерархию (заданием ключевого слова PRIOR).
Иерархическое упорядочение задается использованием
следующей синтаксической конструкции:
130
SQL — язык обработки данных Oracle
131
Раздел 2
-3 START WITH Atl = 1;
1 1 2
2 2 4
3 4 6
1 1 3
2 3 5
3 5 7
1 5 7
2 3 5
3 1 3
132
SQL — язык обработки данных Oracle
Группирование
и агрегатные функции
Для организации группирования отобранных данных с
целью их совместной обработки используется ключевое сло-
во GROUP BY. Совместная обработка данных обычно сво-
дится к вычислению некоторой функции: суммы, среднего
значения, числа элементов множества отобранных значений и
т. п. Ключевое слово HAVING используется для формирова-
ния дополнительных условий включения групп в результи-
рующее множество.
Использование ключевого слова GROUP BY приводит к
тому, что оператор SELECT выдает одну производную строку
для каждой группы строк, формируемых на основе одинако-
вых значений для столбцов или выражений. Следует отме-
тить, что, как правило, все столбцы, которые указываются в
конструкции GROUP BY и по которым осуществляется груп-
пировка, должны присутствовать в списке после ключевого
слова SELECT. В противном случае при выполнении запроса
можно получить сообщение о том, что группирующая функ-
ция не является одногрупповой.
Синтаксис конструкции группирования строк:
133
Раздел 2
1 1.5
2 3.5
2 3.5
Листинг 52. Примеры расчетов безусловного средне-
го и условного среднего
134
SQL — язык обработки данных Oracle
ERROR at line 2:
ORA-00979: not a GROUP BY expression'
1 2
2 «• 2.5
135
Раздел 2
(1+1+2)/3
1.3333333
(1+2)/2
1.5
(1+1+2+0)74
136
SQL — язык обработки данных Oracle
SQL> SELECT S U M ( A t l ) , S T D D E V ( A t l ) ,
2 SQRT(VARIANCE(Atl)) FROM Tabl ;
4 .57735027 .57735027
137
Раздел 2
Функция подсчета числа отобранных строк COUNT воз-
вращает количество выбранных строк. Особый вариант ис-
пользования функции COUNT(*) возвращает число строк в
таблице, включая дубликаты и атрибуты с неопределенными
значениями. Функция использует следующий синтаксис:
COUNT(DISTINCT A T I ) COUNT(ATI) C O U N T ( * )
2 3 4
MAX(Atl) MIN(At2)
С 15-06-2001
140
SQL — язык обработки данных Oracle
141
Раздел 2
142
SQL — язык обработки данных Oracle
143
Раздел 2
1
2
i
Листинг 58. 'Протокол создания связи с удаленной
базой данных и запроса с использованием со-
зданной связи
144
SQL — язык обработки данных Oracle
ATI
1
2
Средства определения
и уничтожения снимков
148
SQL — язык обработки данных Oracle
1
2
4
Г
ATI
1
2 i
4
ATI
2
4
10
150
SQL — язык обработки данных Oracle
Последовательности.
Синонимы
Создание последовательностей
Последовательностью называется объект базы данных,
генерирующий неповторяющиеся целые числа. Полученные
из последовательности числа обычно используются в качест-
ве значений для первичных ключей.
Числа, создаваемые последовательностью, могут либо
возрастать постоянно, либо только до определенного предела,
либо, по достижении предела, начинать возрастание заново, с
начального значения. Последовательность может создавать
цепочки как увеличивающихся чисел, так и уменьшающихся.
Можно задавать также и приращение значений.
Псевдостолбец NEXTVAL используется для генериро-
вания очередного номера из указанной последовательности.
Ссылка на NEXTVAL приводит к генерированию очередного
номера. Обращение имеет следующий синтаксис:
имя_последовательности.NEXTVAL.
CREATE SEQUENCE
[имя_схемы. ] имя_последовательности
[INCREMENT BY приращение]
[START WITH начальное_значение]
[MAXVALUE наиболынее_значение \ NOMAXVALUE]
[.MINVALUE наименьшее^значение \ NOMINVALUE]
_[CYCLE | NOCYCLE]
[CACHE число_элементов \ NOCACHE]
[ORDER | NOORDER]
152
SQL — язык обработки данных Oracle
NEXTVAL
NEXTVAL
NEXTVAL
NEXTVAL
NEXTVAL
156
SQL — язык обработки данных Oracle
157
Раздел 2
ERROR at -line 1:
ORA-00942: table or view does not exist
159
Раздел 2
1 Textl
2 Text2
162
SQL — язык обработки данных Oracle
163
Раздел 2
164
Раздел 3
PL/SQL — процедурное
расширение языка SQL
165
Раздел 3
Управление выполнением
программы
Операторы большинства языков программирования, в
том числе и PL/SQL, выполняются последовательно. Такая
схема называется потоком команд. В любом развитом языке
присутствует более или менее богатый набор операторов
управления потоком команд. Соответствующие операторы
позволяют выполнять условные переходы, циклически вы-
полнять группу операторов и осуществлять выход из цикла
при выполнении определенных условий. В PL/SQL преду-
смотрено несколько операторов, с помощью которых можно
управлять выполнением потока команд программы. Рассмот-
рим соответствующие программные конструкции.
169
Раздел 3
Оператор ветвления
Оператор IF...THEN...ELSE позволяет проверить условие
и, в зависимости от результатов проверки (TRUE или
FALSE), выполнить различные группы операторов. Альтер-
нативная последовательность операторов определяется клю-
чевым словом ELSE. Границы действия оператора IF опреде-
ляются закрывающей операторной скобкой END IF. Для
расширения структуры ветвления дополнительно
предусмотрены операторные скобки ELSIF, задающие
структуры ветвления более глубокого уровня.
Oracle использует следующий синтаксис конструкции
ветвления в PL/SQL:
* - •
IF условие_1 THEN
операторы_1; -- ветвь!
ELSIF условие_2 THEN
операторы_2; — ветвь2
ELSIF
SQL> DECLARE
2 'Lamda NUMBER; — Длина волны
3 Textl VARCHAR2(30):='Инфракрасное излучение';
4 Text2 VARCHAR2 (30.) := 'Видимый свет ' ;
5 Text3 VARCHAR2(30) := 'Ультрафиолет-';
6 — Исполнительный блок
7 BEGIN
170
PL/SQL — процедурное расширение языка SQL
8 Lamda := &Input_Data;
9 DBMS_OUTPUT.PUT_LINE('');
10 IF (Lamda > 0 . 6 5 )
11 THEN DBMS_OUTPUT.PUT_LINE(Textl);
12 ELSIF (Lamda < 0.41)
13 THEN DBMS_OUTPUT.PUT_LINE(TextS);
14 ELSE
15 DBMS_OUTPUT.PUT_LINE(Text2) ;
16 END IF;
17 END;
/
Enter value for input_data:. 0.33
old 8: Lamda := &Input_Data;
new 8: Lamda := 0.33;
Ультрафиолет
Операторы цикла
Организация цикла оформляется в программе на PL/SQL
несколькими способами. Самый простой — использование
оператора LOOP. Выйти из цикла можно несколькими спосо-
бами. Конструкция EXIT WHEN обеспечивает выход из цик
ла при выполнении условия в соответствующем операторе.
Рассмотрим пример определения числа, факториал которого
является наименьшим числом, большим заданной константы
(например, 1 000 000 000).
SQL> DECLARE
2 Arg NUMBER;— Перем. для выч. факториала
3 I NUMBER; — Переменная-счетчик
4 Limit NUMBER := 1000000000; — Граница
5 Textl VARCHAR2 (80)- := 'Факториал числа,
впервые превышающий 1 000 000 000 ' ;
6 — Исполнительный блок
171
Раздел 3
1 BEGIN
8 I := 0;
9 Arg := 1;
10 LOOP
11 EXIT WHEN ARG > Limit;
12 Arg := A r g * ( I + D ;
13 I := I + 1;
14 END LOOP;
15 DBMS_OUTPUT.PUT_LINE(Textl) ;
16 DBMS_OUTPUT.PUT_LINE(TO_CHAR(Arg) ) ;
17 DBMS_OUTPUT.PUT_LINE(' Искомое число
1
| I TO_CHAR ( I } ) ;
18 END;
SQL> DECLARE
2 -Arg NUMBER; — Перем. для выч. факториала
3 I NUMBER; — Переменная-счетчик
4 Limit NUMBER := 1000000000000; — Граница
5 Textl VARCHAR2(80) := 'Факториал числа,
впервые превышающий 1 000 000 000 000 ';
6 — Исполнительный блок
7 BEGIN
172
PL/SQL — процедурное расширение языка SQL
8 I := 0;
9 Arg := I;
10 WHILE Arg < 1000000000000 LOOP
11 Arg := Arg*(1+1);
12 I := I + I;
13 END LOOP;
14 DBMS JDUTPU.T.PUT_LINE( Text 1);
15 DBMS_OUTPUT.PUT_LINE(TO_CHAR(Arg));.
16 DBMS_OUTPUT.PUT_LINE('Искомое число =
1
| |TO_CHAR(I)};.
17 END;
SQL> DECLARE
2 Arg NUMBER:= 1;— Перем. для выч. факториала
3 Limit NUMBER := 20;.— Граница
4 Textl VARCHAR2(30) := 'Факториал числа 20=';
5 — Исполнительный блок
6 BEGIN
7 FOR I IN 1..Limit LOOP
8 Arg := Arg*I;
9 END LOOP;
10 DBMS_OUTPUT.PUT_LINE(Textl||TO_CHAR(Arg));
11 END;
173
Раздел 3
/
Оператор GOTO
Курсоры
Ключевым понятием языка PL/SQL является курсор. Кур-
сор — это поименованный запрос, содержащий некоторое
фиксированное число строк в выборке. По существу курсор
является окном, через которое пользователь получает доступ
к информации базы данных. Курсоры, в частности, могут ис-
пользоваться для присваивания конкретных значений пере-
менным программы. PL/SQL неявно объявляет курсор для
всех SQL-предложений манипулирования данными, включая
запросы, возвращающие ровно одну строку. Допустимое ко-
личество курсоров на сессию устанавливается параметром
инициализации OPEN_CURSOR в файле параметров.
174
PL/SQL — процедурное расширение' языка SQL
SQL> DECLARE
2 Argl NUMBER;
3 Arg2 VARCHAR2(1) ;
4 BEGIN
5 SELECT Atl,At2 INTO Argl,Arg2
6 FROM Tabl WHERE Atl=l;
7 DBMS_OUTPUT.PUT_LINE{TO_CHAR(Argl) I Г' I IArg2);
8 END;
9 /
1 A
SQL> DECLARE
2 Argl NUMBER;
3 Arg2 VARCHAR2(1);
4 BEGIN
175
Раздел 3
5 SELECT At1,At2 INTO Argl,Arg2 FROM Tabl
6 WHERE At 1=4;
7 DBMS_OUTPUT.PUT_LINE(TO_CHAR(Argl) I I '' I IArg2>;
8 END;
9 /
DECLARE
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 5
SQL> DECLARE
2 Argl NUMBER;
3 Arg2 VARCHAR2(1) ;
4 BEGIN
5 SELECT Atl,At2 INTO Argl,Arg2 FROM Tabl
6 WHERE Atl IN ( 1 , 2 ) ;
7 DBMS_6UTPUT\PUT_LINE(TO_CHAR(Argl) | | " | |Arg2) ;
8 END;
9 /
DECLARE
*
ERROR at line 1:
ORA-01422: exact fetch returns more than re-
quested number of rows
ORA-06512: at line 5
SQL> DECLARE
176
PL/SQL — процедурное расширение языка SQL
2 CURSOR Curl IS SELECT Atl,At2 FROM Tabl;
3 vl V A R C H A R 2 ( 4 0 0 0 ) ;
4 BEGIN
5 FOR rec IN Curl LOOP
6 vl:=LTRIM(vl||' 4lrec.At2);
7 END LOOP;
8 DBMS_OUTPUT.PUT_LINE(vl) ;
9 END;
10 /
A B C
SQL> DECLARE
2 vl V A R C H A R 2 ( 4 0 0 0 ) ;
3 BEGIN
4 FOR rec IN (SELECT Atl,At2 FROM Tabl) LOOP
5 vl:=LTRIM(vl||' '||rec.At2);
6 END LOOP;
7 DBMS_OUTPUT.PUTJLJNE(vl);
8 END;
' 9 /
A B C
OPEN Curl;
SQL> DECLARE -
2 Cursor Curl IS SELECT * FROM Tabl;
3 Rec Curl%ROWTYPE;
4 BEGIN
5 OPEN Curl; — Курсор должен быть открыт
6 FOR I IN 1..3 LOOP
7 FETCH Curl INTO rec;
8 DBMS_OUTPUT.PUT_LINE(TO_CHAR(rec.Atl)I
1
||rec.At2); ' .
9 END LOOP;
10 END;
11 /
1 A
2 В
178
PL/SQL — процедурное расширение языка SQL
3 С
PL/SQL procedure successfully completed.
179
- '
Раздел 3
SQL> DECLARE
2 TYPE tabl_rec_type IS RECORD — Определение
нового типа данных
3 (Argl Tabl-.Atl%TYPE, — Переменная типа ат-
рибута Atl таблицы Tab!
4 Arg2 Tabl.At2%TYPE) ; — Переменная типа ат-
рибута At2 таблицы Tabl
5 Tabl_rec tabl_rec__type; -- Определение объ- •
екта сконструированного типа
6 Cursor Curl IS SELECT * FROM Tabl; -- Опре-
деление курсора
7 BEGIN
8 OPEN Curl; — Курсор должен быть открыт
9 LOOP
10 EXIT WHEN (Cur1%NOTFOUND);
11 FETCH Curl INTO Tabl_rec;
12 DBMS_OUTPUT.PUT_LINE(Curl%ROWCOUNT||'
'||Tabl_rec.Arg2);
13 END LOOP;
14 END;
/
1 A
2 В
3 С
3 С ,
• s
180
PL/SQL — процедурное расширение языка SQL
SQL> DECLARE
2 TYPE tabl_rec_type IS .RECORD — Определение
нового типа данных
3 (Argl Tabl.Atl%TYPE, • — Переменная типа ат-
рибута Atl таблицы Tab!
4 Arg2 Tabl.At2%TYPE) ; — Переменная типа ат-
рибута At 2 таблицы Tab!
5 Tabl_rec tabl_rec_type; — Определение объ-
екта сконструированного типа
6 Cursor Cur2 (I NUMBER) IS SELECT * FROM Tabl
WHERE MOD (Atl, I) = 1;
7 BEGIN
8 OPEN Cur2(2); — Курсор открыт с параметром
2
9 FETCH Cur 2 INTO Tabl_rec;
10 WHILE Cur 2% FOUND LOOP
11 DBMS_OUTPUT.PUT_LINE (Cur2%ROWCOUNT| | '
1
| |Tabl_rec.Argl) ;
12 FETCH Cur2 INTO Tabl_rec;
13 END LOOP;
14 END;
1 1
2 3
PL/SQL procedure successfully completed.
SQL> DECLARE
2 TYPE cursor_type IS REF CURSOR;
3 Curl cursor_type;
4 l_query VARCHAR2(100);
5 . rec Tabl%ROWTYPE;
6 BEGIN
7 l_query:='SELECT * FROM Tabl';
8 l_query:= l_query||' WHERE Atl=l';
9 OPEN Curl FOR l_query;
10 FETCH Curl INTO rec;
11
DBMS_OUTPUT.PUT_LINE(rec.Atl| Г'|Irec.At1);
12 " CLOSE Curl;
13 END;
14 /
11
Обработка исключительных
ситуаций
Большинство развитых языков программирования обла-
дают встроенными механизмами обработки исключительных
ситуаций. Соответствующие языковые средства предусмот-
рены и в PL/SQL. При возникновении предопределенной или
объявленной пользователем ситуации происходит автомати-
182
PL/SQL — процедурное расширение языка SQL
SQL> DECLARE
2 Argl Tabl.AtUTYPE;
3 Arg2 Tabl.At2%TYPE;
4 CURSOR Curl IS SELECT * FROM Tabl;
5 BEGIN
6 WHILE Curl%FOUND LOOP
7 FETCH Curl INTO Argl,Arg2;
8 END LOOP;
9 EXCEPTION
10 WHEN INVALID_CURSOR THEN
11 DBMS_OUTPUT.PUT_LINE('He открыт курсор');
12 END;
/ . :
He открыт курсор
SQL> DECLARE
2 Argl Tabl.Atl%TYPE;
3 Arg2 Tabl.At2%TYPE;
4 CURSOR Curl IS SELECT * FROM Tabl;
5 Arg3 NUMBER := 1;
6 BEGIN
7 Arg3 := Arg3/0;
8 WHILE Curl%FOUND LOOP
9 FETCH Curl INTO Argl>Arg2;
10 END LOOP;
11 EXCEPTION
12 WHEN INVALID_CURSOR THEN
13 DBMSJDUTPUT.PUT_LINE('He открыт курсор');
14 WHEN OTHERS THEN
15 DBMS_OUTPUT.PUT_LINE('Ошибка приложения');
16 END;
/
Ошибка приложения.
имя_исключительной_ситуации EXCEPTION;
185
Раздел 3
RAISE имя_исключительной__ситуации;
SQL> DECLARE
2 Argl Tabl.Atl%TYPE;
3 Arg2 Тabl.At2%TYPE;
4 Special_case EXCEPTION;
5 Cursor Curl IS SELECT * FROM Tabl;
6 BEGIN
1 OPEN Curl;
8 FETCH Curl INTO Argl,Arg2;
9 WHILE Curl%FOUND LOOP
10 FETCH Curl INTO Argl,Arg2;
11 IF Argl > 2
12 THEN RAISE Special_case;
13 END IF;
14 END LOOP;
15 EXCEPTION
16 WHEN Special_case THEN
17 DBMS_OUTPUT.PUT_LINE('Пользовательская ис-
ключительная ситуация1);
18 WHEN OTHERS THEN
186
PL/SQL — процедурное расширение яаыка SQL
19 DBMSJDUTPUT.PUT_LINE('Ошибка приложения');
20 END;
'•
Раздел 3
4 PRAGMA EXCEPTION_INIT
(to_date_convert_error, -01858);
5 BEGIN
6 vl:=TO_DATE('ABC','ddmmyyyy');
7 EXCEPTION
8 WHEN to_date_convert_error THEN
9 DBMS_OUTPUT.PUT_LINE('Произошла ошибка
преобразования даты'};
10 END;
11 /
Произошла ошибка преобразования даты
Процедуры, функции
и пакеты
Реализация языка программирования высокого уровня
предполагает возможность создания и поддержки процедур и
функций. В PL/SQL процедуры и функции, связанные единым
целевым назначением, объединяются в пакеты. Особенно-
стью является то, что процедуры и функции являются объек-
тами базы данных. Это означает, что их описание хранится в
словаре данных, а собственно код хранится не в файловой
системе, а непосредственно в базе данных. Функции отлича-
ются от процедур тем, что функции возвращают в вызываю-
щую среду одно значение соответствующего типа данных, а
процедура не возвращает ничего. Oracle также поддерживает
специальный тип процедур — триггер, который рассматрива-
ется как самостоятельный объект базы данных. Детально
триггеры будут рассмотрены ниже, а коротко триггер можно
охарактеризовать как процедуру, автоматически запускаемую
сервером при наступлении некоторого события.
Исполняемый код процедур и функций хранится в базе
данных в откомпилированной форме, поэтому выполнение
188
PL/SQL — процедурное расширение языка SQL
SQL-функции Oracle
Набор встроенных в язык SQL функций позволяет вы-
полнить многие типовые операции обработки данных вызо-
вом соответствующей функции. Ниже приводится описание
функций, сгруппированное по типовым задачам.
Все встроенные функции можно использовать в SQL-
выражениях (как в списке после ключевого слова SELECT,
так и в других конструкциях). Очевидно, что, имея привиле-
гии на выборку данных из любой таблицы, можно вычислить
значение встроенной функции от любого набора параметров
(указав ее в перечне списка SELECT). Однако имеется еще
один способ. Каждая база данных Oracle имеет специальную
общедоступную таблицу с именем dual. Эта таблица находит-
ся в схеме пользователя SYS и содержит один столбец dummy
и одну строку. Дня нее существует общий синоним. Один из
наиболее распространенных вариантов использования табли-
цы dual — вычисление результатов SQL-функций с помощью
запросов к ней.
Функции, устанавливающие
соответствие числовых кодов и символов
CHR
ABC
Функция ASCII
68
190
PL/SQL — процедурное расширение языка SQL
Функция INITCAP
База Данных
Функция LOWER
база данных
Функция UPPER
БАЗА ДАННЫХ
191
Раздел 3
Функция LPAD
+++база данных
~_
SQL> SELECT RPAD{'база данных 1 , 14, ' + ' )
2 "Функция RPAD" FROM dual;
Функция RPAD
база данных+++
Листинг 93. Пример применения функций дополнения
строк
Функция LTRIM
база данных
Функция RTRIM
база данных
Функция LTRIM
данных
193
7. Заказ № 1628.
Раздел 3
Символьные функции
преобразования строк
Функция TRANSLATE(c/wp0KO_7, символы_поиска, сим-
волы_замены) возвращает значение параметра строка_1, для
которой выполнено следующее преобразование. Все вхожде-
ния параметра символ_поиска замещены значением параметра
символ_замены. Если в строке символы_поиска содержится
больше символов, чем в строке символы_замены, то символы,
которым нет соответствия, замещаются на пустой символ (то
есть исключаются из результирующей строки). Функция
TRANSLATE может применяться, в частности, для обработки
текстов, подготовленных с использованием различных рас-
кладок клавиатур. Пример применения функции'
TRANSLATE представлен в листинге 95.
Функция TRANSLATE
194
PL/SQL — процедурное расширение языка SQL
Функция REPLACE
Фирма LG
BCDE
Функция SUBSTR
CDEF
Листинг 97. Примеры применения функции SUBSTR для
выделения подстрок
195
Раздел 3
Функция INSTR
Функция INSTR
Функция INSTR
196
.1 -
PL/SQL — процедурное расширение языка SQL
197
Раздел 3
Функция POWER
-243
SQL> SELECT P O W E R ( 6 , L O G ( 6 , 5 . 2 5 ) )
2 "Функции POWER и LOG" FROM dual;
5.25
Тригонометрические функции
Функции &Т№(числовой_аргумент), СО8(числовой_аргу-
мент), ТА^(чг4словой_аргумент) возвращают соответственно
198
PL/SQL — процедурное расширение языка SQL
TAN(1.5707)
10381.327
Функция TANH
.91713703
Функция ROUND
-.7
200
PL/SQL — процедурное расширение языка SQL
SQL> SELECT TRUNC(-.65,1) "Функция TRUNC"
2 FROM dual;
Функция TRUNC
-.6
НН12
НН24
MI Преобразование до минут.
15-04-2002 11:13
Функция ROUND
15-04-2002 00:00
Функция TRUNC
15-04-2002 00:00
Функция TRUNC
15-04-2002 11:00
Функция NEXT_DAY
21-04-2002 11:17:35
Функции преобразования
типов данных
1,000,000
Функция TO_CHAR
1E+06
Функция TO_DATE
01-04-2002 00:00:00
87.292
207
"
Раздел 3
SQL> SELECT NVL (Atl, 0.) "Функция NVL", NVL (At2, ' * ' )
2 "Функция NVL" FROM Tabl;
Функция NVL Функция NVL
1 *
О А
14-03-2002 14:17:23
SQL> SELECT NVL(SYSDATE,
209
Раздел 3
2 TO_DATE('ABC', ' D D - M M - Y Y Y Y ' ) ) FROM dual ;
SELECT N V L ( S Y S D A T E , T O _ D A T E ( ' A B C 1 , ' D D - M M - Y Y Y Y ' ) )
*
ERROR at line 1:
ORA-01858: a non-numeric character was found
where a numeric was expected
Функция DECODE
мужскбй
Функция DECODE
пол не определен
210
PL/SQL — процедурное расширение языка SQL
10 1
Справочные функции
211
Раздел 3
ul 5 0 DATAFORT US
CHK
39466
39723
39504
Создание пользовательских
процедур и функций
Процедуры и функции — это объекты базы данных и,
следовательно, они создаются командой CREATE и уничто-
жаются командой DROP. При создании процедуры или функ-
ции должны быть определены имя объекта, перечень и тип
213
Раздел 3
SQL> BEGIN
2 InsRec(240)
215
Раадел 3
3 END;-
4 /
ARG1 ARC 2
120 04-05-2002
218
PL/SQL — процедурное расширение языка SQL
SQL> BEGIN
2 DBMS_OUTPUT.PUT_LINE(SumRecInt(SYSDATE-
1/2, SYSDATE+1/2));
3 END;
4 /
11
219
Раздел 3
Пакеты
Процедуры, функции, переменные и типы, объединенные
общим функциональным замыслом, часто оформляют в виде
единого объекта базы данных — пакета. Прием оформления
родственных программ в пакет хорошо известен из програм-
мистской практики. Особенностью пакетов PL/SQL является
раздельная компиляция и хранение интерфейсной и испол-
няемой частей пакета. Пакет как объект состоит из двух час-
тей: спецификации пакета и тела пакета. В спецификации па-
кета хранится описание процедур, функций, глобальных пе-
ременных, констант, типов и курсоров, которые доступны для
внешних приложений. В теле пакета определяются все про-
цедуры, функции и переменные, включая те, которые не были
определены в спецификации пакета. Процедуры, функции и
переменные, определенные в теле пакета, но не описанные в
его спецификации, являются локальными. Внешние по отно-
шению к пакету приложения не могут обращаться к локаль-
ным объектам пакета. Локальные объекты предназначены ис-
ключительно для использования только процедурами и функ-
циями самого пакета.
Особенностью пакетов PL/SQL является поддержка пере-
гружаемых функций и процедур. Процедуры или функции
могут иметь одинаковое имя, но различный по типу или ко-
личеству набор аргументов. В момент обращения к конкрет-
ной процедуре или функции по числу и типу передаваемых
аргументов автоматически определяется требуемая версия
процедуры или функции, которая и исполняется. Поддержка
перегружаемых процедур, в частности, используется в стан-
дартном пакете DBMS_OUTPUT для единой формы обраще-
ния к процедуре PUT_LINE для вывода данных различных
типов.
Для создания пакета пользователь должен иметь приви-
легию CREATE PROCEDURE. Создание пакета в схеме дру-
220
PL/SQL — процедурное расширение языка SQL
того пользователя требует наличия привилегии CREATE
ANY PROCEDURE. Оператор определения интерфейсной
части (спецификации) пакета Oracle использует следующий
синтаксис:
221
Раздел 3
Ключевое слово OR REPLACE указывает на безусловное
замещение старого текста тела пакета. Если ключевое слово
OR REPLACE не указано и пакет определен в системе, то за-
мещения старого значения тела пакета не происходит и воз-
вращается сообщение об ошибке.
Определение тела пакета начинается с описания конс-
тант, типов и переменных. Константы, типы и переменные,
описанные в спецификации пакета, являются глобальными и
в теле пакета повторно не описываются. При описании кон-
стант и переменных пакета ключевое слово DECLARE не ис-
пользуется.
Рассмотрим пример создания тела пакета, спецификация
которого приведена в листинге 122. Пусть функция пакета
mulconst выполняет умножение аргумента на константу паке-
та, а процедура auditmul фиксирует факт обращения к функ-
ции mulconst записью в таблицу значения счетчика рбраще-
ний и текущей даты. Предполагается, что таблица TabAUD с
соответствующими типами данных атрибутов к моменту соз-
дания тела пакета создана. Протокол создания тела пакета
приведен ниже.
SQL> BEGIN
2 DBMS_OUTPUT.PUT_LINE(PACAA.PACAA_CONST};
3 END;
4 /
1.2
SQL> BEGIN
2 DBMS_OUTPUT.PUT_LINE{PACAA.PACAA_COUNT);
3 END;
4 /
DBMS_OUTPUT.PUT_LINE(PACAA.PACAA_COUNT);
*
ERROR at line 2:
ORA-06550: line 2, column 30:
PLS-00302: component 'PACAA_COUNT' must be de- •
clared
223
Раздел 3
ORA-06550: line 2, column 3:
PL/SQL: Statement ignored
SQL> BEGIN
2 DBMS_OUTPUT.PUT_LINE(PACAA.MULCONST(111));
3 END;
4 /
133.2
ATI AT2
1 19-03-2002
Ul VI
U2 PACKAGE1
SQL> BEGIN
2 packagel.vl:='A';
3 DBMSJ3UTPUT.PUT_LINE(packagel. vl) ;
4 END;
5 /
Д
\ ' 1'
SQL> BEGIN
2 DBMS_SESSION.RESET_PACKAGE;
3 END;
226
PL/SQL — процедурное расширение языка SQL
4 /
227
Раздел 3
229
Раздел 3
231
*
Раздел 3
ERROR.at line 1:
ORA-20002: Слишком большое уклонение
ORA-06512: at "Ul.TRIGJTBl", line 9
ORA-04088: error during execution of trigger
'U1.TRIG_TB1'
ATI
1
3
5
4
ATI
1
233
Раздел 3
3
5
4
236
PL/SQL — процедурное расширение языка SQL
SQL> CREATE OR REPLACE TRIGGER Tr3
2 AFTER DELETE ON Tabl
3 BEGIN
4 packagel.null_tab;-
5 END;
6 /
Trigger created.
ATI AT2
Динамический SQL
240
PL/SQL — процедурное расширение языка SQL
241
Раздел 3
' 21 END IF;
28 END LOOP;
29 COMMIT;
30 DBMS_SQL.CLOSE_CURSOR(c_cursor);
31 DBMSjSQL.CLOSE_CURSOR(d_cursor);
32 END;
33 I
Procedure created.
SQL> BEGIN
2 copy (' Tabl', ' Tab2'') ;
3 END;
4 J
PL/SQL procedure successfully completed.
ATI AT2
1 15-03-2002
2 05-03-2002
Файловый ввод-вывод
Иногда возникает необходимость организовать работу
программ PL/SQL с текстовыми файлами, например, для ор-
ганизации обмена данными с внешними системами. Конечно,
с этой целью можно использовать клиентское приложение,
например SQL*Loader, или с помощью Oracle Report Builder
создать текстовый отчет. Но есть ситуации, когда обработку
файлов требуется встроить именно в хранимые программы на
стороне сервера, например, для ведения собственного журна-
ла аудита или протокола, характеризующего действия прило-
жений. При неудачном завершении операции изменения, сде-
ланные в таблицах аудита, будут отменены наряду с измене-
ниями собственно данных. Если же производить запись изме-
нений в текстовый файл на стороне сервера, то они сохраня-
ются и после отката транзакций. С помощью механизмов
PL/SQL для работы с файлами также можно загружать в базу
данных Java-программы.
Пакет UTL_FILE предоставляет программам PL/SQL
возможность открывать текстовый файл, находящийся в не-
котором каталоге на сервере и работать с ним. В пакет
UTL_FILE входят процедуры, описанные в таблице 7.
Все каталоги, которые использует в своей работе пакет
UTLJFILE, должны быть перечислены в параметре utl_file_dir
в файле параметров базы данных. Для просмотра допустимых
названий каталогов можно использовать соответствующее
представление словаря данных:
245
Раздел 3
DIR
C:\Dirl
:
Листинг 136. Просмотр доступных каталогов .
246
PL/SQL — процедурное расширение языка SQL
Procedure created.
247
Раздел 3
SQL> BEGIN
2 table_copy('A');
3 END;
4 /
249
Раздел 3
Таблица 8. Описание процедур и функций пакета
DBMS JOB
SQL> DECLARE
2 l_job_num NUMBER;
3 BEGIN
4 DBMS_JOB.SUBMIT(l_job_nura,'pi;',sysdate,
5 . 'sysdate+1/8640');
6 COMMIT;
7 DBMS_OUTPUT.PUT_LINE{l_j ob_num);
8 END;
9 /
23
250
PL/SQL — процедурное расширение языка SQL
251
Раздел 3
SQL> BEGIN
2 DBMS_ JOB. REMOVE ( 2 3 ) " ;
3 END;
4 /
Управление LOB-объектами
253
Раздел 3
BFILE-y казателя .
COPY Копирует LOB-объекты.
ERASE Удаляет объект полностью или час-
тично.
TRIM Обрезает LOB-объект до заданной
длины.
SQL> BEGIN
2 f_compare('fname.txt','fname.txt');
3 END;
4 /
256
PL/SQL — процедурное расширение языка SQL
Файлы одинаковые
SQL> BEGIN
2 f_compare('fname.txt','fname2.txt'};
3 END;
, 4 /
Файлы различные
SQL> BEGIN
2 f_compare('fname.txt','fnameS.txt');
3 END;
4. /
BEGIN
-*
ERROR at line 1:
ORA-22288: f i l e or LOB operation FILEOPEN failed
He удается найти указанный файл
ORA-06512: at "SYS.DBMS_LOB", line 475
ORA-06512: at "SYSTEM.F_COMPARE", line 9
ORA-06512: at line 2
SQL> DECLARE
2 1_BLOB BLOB;
3 fil_l BFILE;
4 BEGIN
257
9. Заказ № 1628.
-
Раздел 3
.5 SELECT At2 INTO 1_BLOB FROM Tabl
6 WHERE At1=2 FOR UPDATE;
7 fil_l == BFILENAME( ' DIR1',. 'fname.txt') ;
8 DBMS_LOB.FILEOPEN(fil_l);
10 DBMS_LOB.LOADFROMFILE(1_BLOB,fil_l,
11 DBMS_LOB.GETLENGTH(fil_l));
12 COMMIT;
13 END;
14 /
Управление
многопользовательским доступом
Procedure created.
261
Раздел 3
Директива Ограничения
WNDS Функции запрещена модификация
данных в таблицах (представлениях)
базы данных.
WNPS Функции запрещена модификация
\
переменных, хранимых в пакетах.
RNDS Функции запрещено чтение данных
из таблиц и представлений базы дан-
ных.
RNPS Функции запрещено чтение значений
переменных, хранимых в пакетах.
262
PL/SQL — процедурное расширение языка SQL
ATI STR
263
Раздел 4
Средства разграничения
доступа в Oracle
264
Средства разграничения доступа в Oracle
Анализ включающей
инфраструктуры
Любой сервер баз данных работает под управлением не-
которой операционной системы, поэтому первым шагом ана-
лиза защищенности информации в базах данных должен быть
анализ защищенности ресурсов сервера баз данных как объ-
ектов операционной системы. Система безопасности сервера
баз данных включает как внешние по отношению к серверу
средства (в первую очередь средства операционной системы),
так и собственные механизмы сервера. Верхний уровень за-
щиты информации базы данных состоит в контроле принци-
пиальной возможности доступа к данным. Прежде чем нач-
нется работа с базой данных, администратор должен выпол-
нить некоторые действия по инициализации сервера. Никакой
пользователь не может использовать данные, пока обладаю-
щий соответствующими правами администратор не запустит
сервер и не сделает базу данных доступной. В терминологии
Oracle администратор должен запустить экземпляр (instance)
266
Средства разграничения доступа в Oracle
С: \orant>svrmgr30
Oracle Server Manager Release 3.0»5.0.0 - Produc-
tion
(c) Copyright 1997, Oracle Corporation. All
Rights Reserved.
OracleS Enterprise Edition Release 8.0.5.0.0 -.
Production
PL/SQL Release 8.0.5.0.0 - Production
SVRMGR> connect internal
Password:
Connected.
SVRMGR>startup
ORACLE instance started.
Total System Global Area 15077376 bytes
Fixed Size - 49152 bytes
Variable Size 12906496 bytes
Database Buffers 2.048000 bytes
Redo Buffers 73728 bytes
Database mounted.
Database opened.
SVRMGR>exit
Server Manager complete.
С:\orant>svrmgr30
Oracle Server Manager Release 3 . 0 . 5 . 0 . 0 - Produc-
tion
( c ) Copyright 1997, Oracle Corporation. All
Rights Reserved.
OracleB Enterprise Edition Release 8 . 0 . 5 . 0 . 0 -
Production
PL/SQL Release 8 . 0 . 5 . 0 . 0 - Production
SVRMGR> connect internal
Password:
Connected.
SVRMGR>shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
SVRMGR>exit
Server Manager complete.
269
Раздел 4
ATI
12
Идентификация пользователей
Каждый пользователь Oracle должен иметь специальный
идентификатор: имя или точку входа. Создание нового иден-
тификатора осуществляется уполномоченным пользователем
или администратором выполнением предложения CREATE
USER (подробно описанного выше).
С позиций системы источники, предъявившие иденти-
фикатор, неразличимы. То есть, хотя пользователем может
быть как реальный человек, сидящий за терминалом, так и
прикладной процесс, для системы оба объекта тождественны.
270
Средства разграничения доступа в Oracle
271
Раздел 4
'
Раздел 4
Предоставление системных
привилегий
Системные привилегии могут быть предоставлены серве-
ром Oracle двум объектам системы: пользователям (USER) и
ролям (ROLE). Роль представляет собой поименованный на-
бор привилегий. Назначение и языковые средства определе-
ния ролей будут рассмотрены ниже.
Для предоставления системных привилегий пользовате-
лю в соответствии с требованиями стандарта используется
команда GRANT. Пользователь, выдавший команду GRANT,
должен обладать системной привилегией GRANT ANY
PRIVILEGE. Оператор определения системных привилегий
Oracle использует следующий синтаксис:
GRANT системная_привилегия
[{,системная_привилегия }. . .]
ТО {пользователь \ PUBLIC} [{, пользователь }...]
[WITH ADMIN OPTION]
274
Средства разграничения доступа в Oracle
275
Раздел 4
276
Средства разграничения доступа в Oracle
SQL> CREATE TABLE T a b l ( A t 1 NUMBER);
Table created.
277
Раздел 4
278
Средства разграничения доступа в Oracle
Системные привилегии,
определяющие права по работе
с процедурами и триггерами
SQL> BEGIN
2 Ul.InsRec(lll);
3 END;
4 / •
280
Средства разграничения доступа в Oracle
SQL> CONNECT U1/U1PSW8EDUC;
Connected.
ATI . AT2
5.5 05-04-2002
281
Раздел 4
Системные привилегии,
определяющие права по работе
с пользователями
282
Средства разграничения доступа в Oracle
телю каких-либо прав. Приведенный ниже пример показыва-
ет, что пользователь Ш, обладая соответствующей привиле-
гией, успешно создал пользователя U2, но предоставить ему
минимальное право создания сессии не может.
Системные привилегии,
определяющие права по работе
с табличными областями
Особенность привилегии MANAGE TABLESPACE со-
стрит в ее ориентации на управление состоянием табличной
области. Спецификой табличной области является возмож-
ность ее перевода в автономное или оперативное состояние.
Пользователю может быть предоставлена привилегия по
управлению табличной рбластью, но не более сильные при-
вилегии, связанные с изменением табличной области, напри-
мер привилегия добавления файла для хранения данных.
283
Раздел 4
284
Средства разграничения доступа в Oracle
SQL> ALTER TABLESPACE APP_DATA OFFLINE NORMAL;
Tablespace altered.
Системные привилегии,
определяющие права по работе с
последовательностями
- -
'
Раздел 4
Системные привилегии,
определяющие права по работе
с синонимами
286
Средства разграничения доступа в Oracle
287
Раздел 4
Системные привилегии,
определяющие права по выполнению
глобальных действий в системе
288
Средства разграничения доступа в Oracle
Таблица 20. Обозначение и сущность системных при-
вилегий Oracle, связанных- с управлением
действиями с остальными объектами базы дан-
ных
289
10. Заказ № 1628.
Раздел 4
290
Средства разграничения доступа в Oracle
291
10*
Раздел 4
NEXTVAL
1
SQL> CONNECT SYSTEM/MANAGER0EDUC;
Connected'.
292
Средства разграничения доступа в Oracle
SQL> CREATE USER U3 IDENTIFIED BY U3PSW;
User created.
NEXTVAL
293
Раздел 4
SQL> CONNECT'U1/U1PSW@EDUC;
Connected.
ATI
123
294
Средства разграничения доступа в Oracle
Предоставление привилегий
доступа к объекту
Привилегии доступа к объекту могут быть предоставлены
сервером Oracle двум объектам системы: пользователям
(USER) и ролям (ROLE). Роль представляет собой поимено-
ванный набор привилегий. Назначение и языковые средства
определения ролей будут рассмотрены ниже.
Для предоставления привилегий пользователю в Oracle, в
соответствии с требованиями стандарта, используется коман-
да GRANT. Пользователь, выдавший команду GRANT, либо
должен быть владельцем объекта (то есть пользователем, в
схеме которого создан данный объект), либо наследовать со-
ответствующую привилегию, то есть привилегия была пере-
дана ему с параметром WITH GRANT OPTION, либо обла-
дать привилегией GRANT ANY PRIVILEGE.
Операторы определения привилегий доступа к объектам
управляют разграничением доступа к объектам Oracle: табли-
цам, представлениям, последовательностям, процедурам,
функциям и пакетам, снимкам и синонимам. Оператор опре-
деления привилегий доступа к объектам Oracle использует
следующий синтаксис:
GRANT{привилегия_доступа_к_объекту\ ALL
PRIVILEGES}
[имя_столбца [ { , имя_столбца}...] ]
[ {, привилегия_доступа_к_объекту }...]
ON [имя_схемы.}имя_объекта
ТО {пользователь \ PUBLIC}
[WITH GRANT OPTION]
295
Раздел 4
Таблица 21. Обозначение сущность .привилегии
доступа к объекту
Привилегия Разрешаемые
привилегией действия
SELECT Пользователь с этой привилегией
может выполнять выборку данных из
соответствующего объекта.
INSERT Пользователь с этой привилегией
может выполнять вставку данных в
соответствующий объект. Данная
привилегия допускает уточнение для
определенных элементов объекта.
UPDATE Пользователь с этой привилегией
может выполнять модификацию дан-
ных соответствующего объекта. Дан-
ная привилегия допускает уточнение
для определенных элементов объекта.
REFERENCES Пользователь с этой привилегией
может определить ссылку, по которой
производится контроль целостности
объекта. Данная привилегия допуска-
ет уточнение для определенных эле-
ментов объекта.
DELETE Пользователь с этой привилегией
может выполнять удаление данных в
соответствующем объекте.
EXECUTE Пользователь с этой привилегией
может выполнять действие с соответ-
ствующим объектом (например, вы-
полнить процедуру из пакета).
INDEX Пользователь с этой привилегией
может выполнять операцию индекси-
рования для соответствующего объ-
екта.
296
Средства разграничения доступа в Oracle
ATI
123
ATI
345
297
Раздел 4 ,
ERROR at line 1:
ORA-01031: insufficient privileges
ATI AT2
345 123
299
Раздел 4
Управление привилегиями
с помощью ролей
Большое число пользователей, статус которых требует
различных привилегий для доступа к ресурсам базы данных,
создает значительный объем рутинной работы администрато-
ру. Oracle предлагает языковое средство для автоматизации
работы администратора по разграничению доступа. Данное
средство поддерживается как объект базы данных, называе-
мый ролью (ROLE). Роль — это поименованный набор при-
вилегий, который может быть предоставлен пользователю
или другой роли. Роль не является объектом какой-либо схе-
мы.
'300
Средства разграничения доступа в Oracle
Системные привилегии,
определяющие права по работе с ролями
302
Средства разграничения доступа в Oracle
Управление допустимостью
использования ролей
306
Средства разграничения доступа в Oracle
ATI
123
SQL> BEGIN
2 DBMS_SESSION.SET_ROLE('NONE');
3 END;
4 /
Отмена привилегий
Чтобы отменить системные привилегии или привилегии
доступа к объекту, предоставленные пользователям или ро-
лям, используется команда REVOKE. Стандарты ANSI/ISO
SQL не определяют синтаксис команды отмены привилегий.
В Oracle для отмены системных привилегий и привилегий
доступа к объекту используются различные синтаксические
конструкции.
309
Раздел 4
Использование представлений
для разграничения доступа
Широко используемым, простым и эффективным спосо-
бом разграничения доступа является использование представ-
лений (view). Представление — это динамически поддержи-
ваемая сервером выборка из одной или нескольких таблиц.
Оператор SELECT, определяющий выборку, ограничивает
видимые пользователем данные. Кроме того, представление
позволяет эффективно ограничить данные, которые поль-
зователь может модифицировать. Сервер гарантирует акту-
альность представления, то есть формирование представле-
ния (подстановка соответствующего запроса) производится
каждый раз при обращении к нему. Используя представления,
администратор безопасности ограничивает доступную поль-
зователю часть базы данных только теми данными, которые
реально необходимы для выполнения его работы.
Наличие такого объекта, как представление, позволяет
администратору делать действие привилегий более избира-
310
Средства разграничения доступа в Oracle
VAT1
3
2
SQL> BEGIN
2 Ul.getdata;
3 END;
4 /
1 2
3 4
Использование триггеров
для повышения защиты системы
Триггер — это совокупность предложений языка PL/SQL,
автоматически запускаемая при регистрации сервером опре-
деленных событий в системе. Триггеры выполняются систе-
мой автоматически до или после возникновения предопреде-
ленных событий, таких, как выполнения операций INSERT,
UPDATE, DELETE в некоторой таблице. Способы использо-
вание триггеров для повышения защищенности системы по-
добны использованию хранимых процедур. Особенностью
триггеров является реализуемая возможность выполнить не-
314
Средства разграничения доступа в Oracle
CONNECT SYSTEM/MANAGER8EDOC
Connected.
315
Раздел 4
SQL> INSERT INTO AuthTab VALUES ('Ul');
1 row created.
SQL> CREATE OR REPLACE FUNCTION FuncAuth
2 RETURN NUMBER
.3 AS
4 varl NUMBER;
.5 BEGIN
6 SELECT COUNT(*) INTO varl FROM AUTHTAB
7 WHERE Atl IN (USER);
8 RETURN varl-;
9 END;
10 /
Function created.
317
Раздел '4
SQL> GRANT CONNECT TO U2;
Grant succeeded.
318
Средства разграничения доступа в Oracle
ATI
111
ATI AT2
111 10-04-2002
Средства аудита
Полноценная система обеспечения безопасности должна
обладать развитыми средствами аудита, то есть автоматиче-
ского ведения протоколов действий пользователей системы.
Таблицы для записей аудита обычно являются частью слова-
ря данных. В Oracle основной таблицей для записей аудита
является таблица SYS.AUD$. В данной таблице 28 столбцов,
что позволяет вести достаточно детальный аудит событий в
системе.
Для каждой контролируемой операции фиксируется ин-
формация о пользователе, выдавшем запрос на операцию, ти-
пе операции, об объектах базы данных, на которые воздейст-
вовала операция, дате и времени выполнения операции. На
базе таблицы SYS.AUD$ построено несколько представле-
ний, информация из которых обычно и обрабатывается адми-
нистраторами системы и возможно пользователями. Наиболее
часто используются представления: DBA_AUDIT_TRAIL,
USER_AUDIT_TRAIL, USER_AUDIT_OBJECT, а также
USER_AUDIT_SESSION,USER_AUDIT_STATEMENT.
Для того чтобы началась автоматическая фиксация собы-
тий в системе при помощи включения соответствующих за-
319
Раздел 4
писей в таблицу аудита, необходимо активизировать службу
аудита и определить перечень фиксируемых событий. Для
активизации службы аудита необходимо включить в файл
параметров базы данных параметр audit_trail = true (при ис-
пользовании стандартного файла инициализации данный па-
раметр присутствует, но закомментирован) и перезапустить
сервер для того, чтобы измененное значение параметра при-
вело к включению службы аудита.
Определение перечня фиксируемых событий может быть
модифицировано в любое время пользователем, имеющим
привилегию AUDIT SYSTEM (для аудита системных собы-
тий) или AUDIT ANY (для аудита событий, связанных с до-
ступом к объекту системы). Заметим, что модификация пе-
речня фиксируемых событий может быть выполнена и в пе-
риод, когда служба аудита не активизирована. Естественно,
что записи о событиях перечня начнут появляться только по-
сле активизации службы.
320
Средства разграничения доступа в Oracle
321
-И. Заказ Мо 1628.
Раздел 4
Таблица 25. Обозначение и сущность основных сис-
темных событий Oracle, фиксирование которых
определяется параметром имя_группы_событий
команды AUDIT
322
Средства разграничения доступа в Oracle
323
11*
Раздел 4
SQL> NOAUDIT CONNECT.;
Noaudit succeeded.
Ul 11-04-2002 0
U2 11-04-2002 0
UNKNOWN 11-04-2002 1017
SYSTEM 11-04-2002 0
324
Средства разграничения доступа в Oracle
Таблица 26. Обозначение дополнительных системных
событий, фиксирование которых определяет
имя_грулпы_ событий
AUDIT {имя^регистрируемого_действия]
[ {, {имя_регистрируемого_действия } . . . ]
ON { [ с х е м а . ] о б ъ е к т \ DEFAULT}
[BY { SESSION | ACCESS }]
[WHENEVER [NOT] SUCCESSFUL]
328
Средства разграничения доступа в Oracle
Ul 103 12-04-2002
USERNAME SES_ACTIONS
Ul . F
NOAUDIT.
{имя_группы_событий \ системная_привилегия]
[{,имя_группы_событий |системная_привилегия }...]
[BY пользователь {[, пользователь} ...}]
[WHENEVER [NOT] SUCCESSFUL]
NOAUDIT имя_регистрируемого_действия
[, имя_регистрируемого_действия ...]
ON [схема].объект
[WHENEVER [NOT] SUCCESSFUL]
которым рабо-
тает поль-
зователь.
TERMINAL VARCHAR2(255) Идентификатор
.
клиентского
- терминала
пользователя.
TIMESTAMP DATE Дата и время
создания реги-
страционной
записи.
OWNER VARCHAR2(30) Владелец объ-
екта, с ко-
торым взаимо-
>-'..'""* действует
пользователь
(для аудита
объектов
Oracle).
OBJ_NAME VARCHAR2(128) Имя объекта, с
которым взаи-
-, модействует
пользователь
(для аудита
объектов
Oracle).
ACTION NUMBER Числовой код
регистрируемо-
го действия
пользователя.
ACTION_NAME VARCHAR2(27) Название реги-
стрируемого
действия поль-
зователя.
NEW OWNER VARCHAR2(30) Владелец пере-
333
Раздел 4
именованного
объекта.
NEW_NAME VARCHAR2(128) Новое имя пе-
реименованно-
го объекта.
OBJ_PRIVILEGE VARCHAR2(16) Привилегии
доступа к объ-
екту, которые
были предо-
ставлены или
отозваны.
SYS_PRIVILEGE VARCHAR2(40) Системные
привилегии,
которые были
предоставлены
или отозваны.
ADMINJDPTION VARCHAR2(1) Индикатор
предоставле-
ния привиле-
гий с парамет-
ром WITH
. e
ADMIN
s
OPTION (при-
нимает значе-
ния Y и N)
GRANTEE VARCHAR2(30) Имя пользова-
теля, у которо-
го изменены
привилегии ко-
мандами
GRANT или
REVOKE.
AUDIT_OPTION VARCHAR2(40) Параметры ко-
манды AUDIT.
334
Средства разграничения доступа в Oracle
335
Раздел 4
336
Средства разграничения доступа в Oracle
337
Раздел 4
CREATE PROFILE {имя_профиля_пользователя} LIMIT-
{имя_параметра_рграничения}
{значение_параметра_ограничения} [.., .]
339
Раздел 4
SQL> ALTER SYSTEM SET RESOURCE_LIMIT = TRUE;
System altered.
-- ожидаем
SQL> SELECT . * FROM dual;
SELECT * FROM dual
*
ERROR at line 1:
ORA-02399: exceeded maximum connect time, you are
being logged off
Дополнительные сведения
Для большой корпоративной системы ведение разграни-
чения доступа может оказаться затрудненным. Причиной мо-
жет оказаться большое число объектов, пользователей, ролей,
привилегий (системных и доступа к объектам). В этом случае
проблема состоит не в том, что невозможно предоставить все
необходимые привилегии, а в том, что в результате операций
взаимно назначаемых привилегий, ролей и т. д. пользователь
может получить несанкционированный доступ к данным. Для
преодоления проблемы рекомендуется использовать специ-
альные программные продукты третьих фирм, которые по-
зволяют по словарю данных сформировать подробные отчеты
по актуальным привилегиям. Также существуют специальные
утилиты анализа таблиц аудита.
340
Средства разграничения доступа в Oracle
341
Раздел 5
Создание приложений на
языке Java
Средства построения
приложений и организации
доступа к базам данных
Широкое распространение Всемирной паутины (WWW)
и систем обработки данных, построенных на Web-
технологиях, привело к тому, что все производители СУБД
342
Создание приложений на языке Java
Создание приложений
на языке Java
Объектно-ориентированным интерфейсом прикладного
программирования (API), обеспечивающим взаимодействие с
Oracle приложений, написанных на языке Java, является
JDBC. Интерфейс JDBC определяет классы объектов Java,
характерных для выполнения операций с базами данных: со-
единение, подготовка и выполнение SQL-операций, доступ к
результатам, доступ к метаданным и т. п.
Набор классов, реализующий интерфейс JDBC для
Oracle, стандартно размещается в файле classeslll.zip или
classesl 12.zip (в зависимости от версии JDK), который обыч-
но располагается в каталоге ORACLE_HOME\JDBC\LIB. Для
разрешения соответствующей ссылки нужно указать место
344
Создание приложений на языке Java
Простейшее приложение
на Java
Класс Connect обеспечивает инициализацию сессии
взаимодействия пользователя с сервером Oracle, включая ау-
тентификацию и авторизацию, установку параметров сессии
(режим выполнения транзакций и т. п.).
Сессия открывается вызовом метода getConnection, пара-
метрами которого являются универсальный локатор ресурса
сервера баз данных, имя пользователя и пароль.
Метод getMetaDataQ обеспечивает получение метадан-
ных из словаря базы данных. Метаданные возвращаются в
форме специального объекта типа DatabaseMetaData.
Рассмотрим пример приложения на языке Java, которое
инициализирует сессию взаимодействия с сервером Oracle.
Считаем, что информация, необходимая для установления
связи с сервером, каталогизирована, а имя пользователя (ul) и
пароль (ulpsw) определены соответствующими переменны-
ми.
catch (SQLException e)
{
// Шаг Х: Универсальный обработчик
// исключительных ситуаций
//
System/out .println ("Хотели как лучше.
System. out. println ("SQLState: " +
e.getSQLState() ) ;
System. out. println ("SQLCODE: " +
e . getMessage ( ) ) ;
347
Раздел 5
C:\WORK>java TestCon
Хотели как лучше...
SQLState: 72000
SQLCODE: ORA-01017: invalid username/password;
logon denied
Простейший апплет
Отличие апплета от представленных программ состоит в
том, что апплет всегда является расширением специального
класса, описание которого хранится в библиотеке java.applet,
и апплет запускается из некоторой HTML-страницы. Рас-
смотрим пример апплета, который обеспечивает инициализа-
цию сессии взаимодействия пользователя с сервером Oracle,
включая аутентификацию пользователя и вывод информации
о параметрах сессии, то есть полный аналог функций прило-
жения, представленного в листинге 176. Текст примера ап-
плета приведен в листинге 180.
Отличие состоит в описании основного класса (являюще-
гося расширением класса Applet) и использовании класса
paint для вывода данных.
String ConnectString =
"jdbc : oracle : thin : @ora_server : 1 521 : ORCL" ;
String UserlD = "Ul";
String Psw = "U1PSW";
350
Создание приложений на языке Java
351
Раздел 5
<html>
<title>3arc^oBOK апплета
<body>
<Ы>Тест соединения с Oracle </hl>
<applet code="TestACon. class" width=400
height=200>
</applet>
</body>
</html>
Выполнение SQL-операторов
создания таблиц,
ввода и модификации данных
Выполнение предложений на языке SQL, не содержащих
подставляемых параметров, осуществляется в два этапа: сна-
чала с помощью метода createStatementQ класса Connect соз-
дается объект — предложение SQL, а потом оно выполняется
вызовом соответствующего метода класса Statement.
Основным методом, предназначенным для выполнения
SQL-предложений, осуществляющих создание и уничтожение
объектов, является метод executeUpdate (String).
Рассмотрим пример приложения на языке Java, которое
создает таблицу с заранее определенным именем и атрибута-
ми. Инициализация сессии взаимодействия с сервером Oracle
осуществляется по технологии, представленной выше и про-
иллюстрированной в листинге 176.
Пусть создается таблица с именем ТаЫ, включающая два
столбца: Atl, содержащий строки переменной длины не более
5 символов и At2, содержащий числа.
try
,353
12. Заказ № 1628.
Раздел 5
DriverManager . registerDriver (new ora-
cle. jdbc .driver .OracleDriver ( ) ) ;
}
catch (Exception' e)
{
System. out .println ( "Ошибка регистрации
драйвера JDBC" ) ;
e.printStackTrace ( ) ;
}
}, •
public static void main (String args [ ] )
{
try
{
//
// Шаг 2: Создание объекта соединения
//
String ConnectString =
" j dbc : oracle : thin : @ora_server : 1521 : ORCL" ;
String UserlD = "Ul";
String Psw = "U1PSW";
Connection con = DriverMan- . *
ager . getConnection (ConnectString, UserlD, Psw) ;
Таблица создана.
355
12*
Раздел 5
String CreTab =
"CREATE TABLE Tabl (Atl varchar(S), At2 Inte-
ger)";
строки
cS.executeUpdate(CreTab);
System.out.println("Таблица создана.");
заменить на строки
-rf V_ . . . " . : • - - . : •
cS.executeUpdate(Crelns);
System.out.println("Строка вставлена.");
356
Создание приложений на языке Java
// •
// Пример приложения, осуществляющего выборку
//
import java.sql.*;
//
// Шаг 4: Выполнить операцию,
// используя метод executeQuery
358
Создание приложений на языке Java
//
ResultSet RS = cS . executeQuery (SelTab) ;
' System, out. printing Atl " + " At2 ") ;
System. out. println (" ----------- ---- ") ;
while (RS.nextO)
{
System. out .print In (RS. get String (1) +
RS.getString(2) } ;
359
Раздел 5
Atl At2
abc 10
abc 10 null
361
Раздел 5
bed 20 2002-03-21
Параметрические запросы
SQL-предложение может содержать подставляемые па-
раметры. Такое предложение готовится вызовом метода
prepareStatement().
Для подстановки параметров в предложение, подготов-
ленное методом prepareStatement, используются специальные
связывающие методы. Каждому типу данных Java соответст-
вует некоторый связующий метод.
Например, для осуществления подстановки символьного
параметра используется метод setString, для осуществления
подстановки целочисленного параметра — метод setlnt. При
вызове метода, осуществляющего подстановку, первый пара-
метр метода указывает относительный номер параметра ис-
ходного запроса. Например, setString(l, "Abe") приведет к
подстановке строки "Abe" на место первого параметра.
Рассмотрим пример, когда критерий запроса содержит
параметр. Пусть запрос формулируется как SELECT * FROM
Tabl WHERE At2 > X, где значение параметра X вводится
пользователем с терминала. По сути изменения коснулись
только шага 3 базового приложения. Текст приложения, вы-
полняющего подстановку вводимого значения в параметри-
ческий запрос, приведен в листинге 189.
import java.sql.*;
'import j ava. io. *;
362
Создание приложений на языке Java
bed 20 2002-03-21
Хранимые процедуры
на языке Java
Поддержка языка Java встроена также в ядро сервера
OracleS (наличие поддержки зависит от версии сервера и
комплекта поставки). В настоящее время активно обсуждает-
ся использование Java для написания хранимых программ в
качестве альтернативы PL/SQL. К преимуществам Java перед
PL/SQL относятся, в частности, большое количество готовых
библиотек, динамическая загрузка классов, расширенные
возможности для работы в сети. К преимуществам PL/SQL
следует отнести его изначальную ориентированность на рабо-
ту внутри базы данных, огромное количество строк PL/SQL-
кода различных приложений, сопровождаемого большим
числом программистов.
Компонент, который осуществляет поддержку Java в ядре
СУБД, называется JServer. JServer осуществляет загрузку
классов Java в базу данных, компиляцию Java-кода, специ-
альным образом поддерживает безопасность выполнения. В
его состав входит виртуальная Java-машина (JVM), которая
запускается для каждой сессии при первом обращении к про-
грамме на языке Java. При этом начинается Java-сессия. При
окончании Java-сессии виртуальная машина уничтожается.
Окончание Java-сессии происходит при окончании сессии в
базе данных, при истечении тайм-аута или при вызове специ-
альной инструкции.пользовательским приложением.
Каждому пользователю базы данных могут быть предос-
тавлены привилегии на выполнение определенных действий в
366
Создание приложений на языке Java
SQL> BEGIN'
2 - DBMS_JAVA.GRANT_PERMISSION('Ul',
3 'java.io.FilePermission','C:\DATA2',
4 'read,write');
5 END;
6 /
SQL> COMMIT;
Commit complete.
367
Раздел 5
368
V
Создание приложений на языке Java
369
Раздел 5
created :CREATE$JAVA$LOB$TABLE
loading : class ell
Fl
372.
Создание приложений на языке Java
SQL> DECLARE
2 str VARCHAR2(200);
3 BEGIN
4 selDataQuery('SELECT TO_CHAR(SYSDATE) FROM
dual',str); '
. 5 selData();
6 END;
7 /
PL/SQL procedure successfully completed.
12-03-2002
12-03-2002
GIVELIST
A - В; С - D;
375
Раздел 6
Средства обеспечения
целостности данных
-
•
Раздел 6
Определение транзакции
и ее роль в СУБД
Транзакция — это последовательность операторов обра-
ботки данных, которые рассматриваются как логически неде-
лимая единица работы с базой данных. В дальнейшем будем
считать, что в роли операторов обработки данных выступают
SQL-предложения, при проведении которых база данных пе-
реводится из одного допустимого состояния в другое. Под
допустимым состоянием понимается такое состояние базы
данных, при котором выполняются ограничения целостности.
Система гарантирует невозможность фиксации некоторой
части действий из транзакции в базе данных. Например, пусть
модификация строк некоторой таблицы оформлена в виде
транзакции. Тогда система гарантирует, что пользователь,
выполняющий выборку из таблицы, будет получать либо
только "старые" данные, либо только "новые". То есть, не-
возможна ситуация, когда в результате запроса возвращается
часть "старых" и часть "новых" данных.
Oracle гарантирует согласованность данных на транзак-
ции. Именно для транзакции данные либо сохраняются в базе
данных в том виде, который доступен всем пользователям,
либо откатываются в состояние, предшествующее началу
транзакции. Если в процессе выполнения транзакции про-
изошел сбой операционной системы или прикладной про-
граммы, после ликвидации последствий сбоя, данные в базе
автоматически восстанавливаются в состояние, предшест-
вующее началу выполнения транзакции.
До тех пор пока транзакция не зафиксирована, ее можно
"откатить" (ROLLBACK), то есть отменить все сделанные
операторами из транзакции изменения в базе данных. Обра-
378
Средства обеспечения целостности данных в Oracle
379
Раздел 6
Предложения SQL,
управляющие транз акциями
Для фиксации или отката транзакции в языке SQL ис-
пользуются предложения COMMIT WORK, SAVEPOINT и
ROLLBACK WORK.
Предложение COMMIT фиксирует транзакцию. Предло-
жение SAVEPOINT сохраняет промежуточную копию со-
стояния задействованных в транзакции объектов базы данных
для того, чтобы впоследствии, при необходимости, можно
было вернуться к состоянию в точке сохранения. Предложе-
ние ROLLBACK выполняет откат транзакции, то есть отме-
няет изменения, выполненные данной транзакцией в базе дан-
ных. Откат транзакции обычно выполняется в том случае,
когда произошла ошибка в приложении, обнаружено наруше-
ние ограничений целостности или обнаружен клинч систем-
ных ресурсов. Для иллюстрации понятия клинча системных
ресурсов рассмотрим пример.
380
Средства обеспечения целостности данных в Oracle
COMMIT [WORK]
382
Средства обеспечения целостности данных в Oracle
SAVEPOINT имя_^точки_сохранения
Пример 1 Пример 2
SQL> INSERT INTO Tab! SQL> INSERT INTO
VALUES(1,1,1); Tabl VALUES(1,1,1) ;
1 row created. ч
1 row created.
COUNT(*)
COUNT(*)
384
Средства обеспечения целостности данных в Oracle
Непротиворечивость
и параллельная обработка
Отличительной особенностью СУБД промышленного
уровня является поддержка параллельной работы многих
пользователей. Пользователи формируют запросы на доступ и
изменение информации в базе данных асинхронно, то есть в
произвольные моменты времени, без взаимной согласованно-
сти действий. Одно из базовых требований к СУБД — под-
держка целостности данных, то есть такого состояния, когда
в произвольный момент времени данные адекватно отобра-
жают состояние моделируемых объектов.
Суть проблемы состоит в том, что в процессе управления
параллельной работой СУБД данные могут быть изменены
или модифицированы не в надлежащей последовательности,
что может привести к потере их целостности.
Перечислим некоторые ситуации, которые могут возник-
нуть из-за асинхронного выполнения действий пользователя с
базой данных:
— "проблема пропавшего обновления" (два пользователя
запрашивают из базы одни и те же данные и используют их
для каких-либо расчетов, а затем пытаются обновить эти дан-
ные);
— "проблема промежуточных данных" (пользователь в
ходе выполнения своей работы имел доступ к промежуточ-
ным данным, внесенным другим пользователем и на их осно-
ве произвел ошибочное обновление);
— "проблема строк-фантомов" (один и тот же запрос,
.выполненный пользователем дважды в течение одной тран-
закции, возвращает два различных результата).
1 a
389
Раздел б .
Типы блокировок
Блокировка — это механизм, предназначенный для пре-
дотвращения некорректного изменения данных при парал-
лельной и асинхронной работе пользователей распределенной
системы. Блокировка используется:
— для обеспечения гарантированной неизменности дан-
ных другими пользователями в рамках транзакции;
—*- для обеспечения естественного временного порядка
изменений, проводимых в базе данных.
Ограничения 'целостности
Средства обеспечения целостности баз данных включают
автоматическую поддержку некоторой системы правил, опи-
сывающих допустимость и достоверность хранимых и вводи-
мых значений. Реляционная модель включает некоторые ха-
рактерные правила, вытекающие из существа модели: огра-
ничения домена и ограничения таблицы.
Целостность домена предполагает, что допустимое мно-
жество значений каждого атрибута является формально
393
Раздел 6
395
Раздел 6
ERROR at line 1:
ORA-00001: unrque constraint (U1.PK_TAB1) vio-
lated
ERROR at line 1:
398
Средства обеспечения целостности данных в Oracle
ORA-02291: integrity constraint (U1.FKJTAB2) vio-
lated - parent key not found
399
Раздел 6
АТЗ АТ4
В 1
400
Средства обеспечения целостности данных в Oracle
CHECK (предикат)
401
Раздел б
SQL> COMMIT;
COMMIT
*
ERROR at line 1:
ORA-02091:' transaction rolled back
ORA-00001: unique constraint (Ul.SYS_C005885)
violated
403
Раздел 6
D:\ORANT\BIN\SQLLDR80 USERID=system/manager§educ
CONTROL=l.ctl LOG=l.log
404
Средства обеспечения целостности данных в Oracle
1;Александр
2;Михаил
3;Мария
4;Ирина
'405
Раздел 6
1 1 Александр
2 2 Михаил
/ 3 3 Мария
4 4 Ирина
406
Средства обеспечения целостности данных в Oracle
Table TABl:
4 Rows successfully loaded.
0 Rows not loaded due to data errors.
0 Rows not loaded because all WHEN clauses were
-failed.
0 Rows not loaded because all fields were null.
407
Раздел 6
Total logical records skipped: 0
Total logical records read: 4
Total logical records rejected: 0
Total logical records discarded: 0
Run began on Thu Feb-14 13:54:29 2002
Run ended on Thu Feb 14 13:54:32 2002
Экспорт/импорт данных
Одна из важных задач, решаемых администратором баз
данных, — обеспечение восстановления базы после аппарат-
ного или программного сбоя. Решение задачи восстановления
данных может быть выполнено различными способами. В
качестве необходимой основы для выполнения операции вос-
становления должна быть некоторая логическая копия базы
данных.
Копия может содержать информацию обо всей или части
базы данных, звписанную на некоторый носитель с помощью
специальных утилит. Администратор баз данных должен ре-
гулярно, в соответствии с некоторым регламентом выполнять
контрольное копирование. Для критически важных и особо
ценных данных обычно поддерживается несколько копий ба-
зы.
Для реализации экспорта/импорта данных предназначены
утилиты Oracle IMPORT и EXPORT. Результат экспорта
409
Раздел 6
410
Средства обеспечения целостности данных в Oracle
D:\ORANT\BIN\EXP80.EXE
D:\ORANT\BIN\EXP80.EXE USERID=system/manager@educ
PARFILE=exp.par
412
Средства обеспечения целостности данных в Oracle
413
Раздел 6
USERID=system/manager@educ
LOG=export.log
FILE=expdat.dmp
TABLES=Tabl
INDEXES=N
414
Средства обеспечения целостности данных в Oracle
D:\ORANT\BIN\imp80 USERID=system/manager@educ
FILE=expdat.dmp
USERID=system/manager@educ
FILE=expdat4 dmp
TABLES=(Tab!,Tab2)
INDEXES=n
LOG=import.log
416
Раздел 7
Методы повышения
производительности
417
14. Заказ № 1628.
•
- - . .
Раздел 7
Оптимизатор
В разделе "Архитектура распределенных систем обработ-
ки данных" рассматривалась последовательность прохожде-
ния оператора SQL через архитектуру сервера Oracle. После
этапа синтаксического анализа на основе информации из сло-
варя базы данных для разобранного оператора создается план
его выполнения. Эту работу выполняет оптимизатор.
Оптимизатор представляет собой программный продукт,
который является важнейшей частью сервера Oracle и пред-
назначен для оптимизации — поиска наиболее эффективного
способа доступа к данным. Оптимизатор должен выбрать та-
кую последовательность действий, которая обеспечит самый
эффективный путь доступа к данным, и сформировать план
выполнения запроса, основанный на найденных методах дос-
тупа. Под методом доступа (access path) подразумевается
вариант алгоритма доступа, а под планом выполнения
418
Методы повышения производительности
420
Методы повышения производительности
Таблица 32. Методы доступа оптимизатору
421
Раздел 7
422
Методы повышения производительности
Анализ запросов
с целью повышения скорости
их выполнения
Изменение SQL-выражений на основе знаний о данных,
индексах, связях таблиц для повышения эффективности их
выполнения, называется коррекцией запросов (query
rewriting). Изменение предложений SQL отличается от напи-
сания новых предложений. Для того чтобы эффективно пере-
писывать запросы, необходимо в течение некоторого времени
накопить знания о системе. Сюда относятся сведения о том,
какие предложения SQL нуждаются в переписывании в связи
с их частым использованием или использованием ими значи-
тельных ресурсов, какие данные ими обрабатываются, каковы
характеристики и распределение этих данных, какие логиче-
ские условия в выражениях можно убрать или трансформиро-
вать в связи с логикой функционирования системы. При ре-
шении задач оптимизации проблемных запросов необходимо
следовать следующим рекомендациям:
Во-первых, при необходимости доступа к значительной
части строк какой-либо таблицы полное сканирование (full
scan) является более эффективным, чем использование ин-
дексов. Граница применения данных методов доступа в об-
щем случае составляет 5-10% записей таблицы, к которым
обращается запрос. Дело в том, что для сканирования индекса
и извлечения строки требуются, по крайней мере, две опера-
ции чтения для каждой строки (одна — для чтения индекса,
другая для чтения данных из таблицы). А при полном скани-
ровании таблицы для извлечения строки требуется только
одна операция чтения. При доступе к большому количеству
строк становится очевидной неэффективность использования
индекса по сравнению с полным сканированием таблицы, при
котором строки считываются непосредственно из таблицы.
423
Раздел 7
424
Методы повышения производительности
• .
Раздел 7
Подсказка Описание
ROWID Использование идентификатора.
CLUSTER Сканирование ключа кластера.
HASH Сканирование хэш-индекса.
INDEX Сканирование индекса.
INDEX_ASC Сканирование индекса в порядке возрас-
тания.
INDEX_DESC Сканирование индекса в порядке убыва-
ния.
INDEX FFS Быстрое полное сканирование индекса.
AND_EQUAL Использование нескольких индексов со
слиянием результатов.
FULL Полное сканирование таблицы.
426
Методы повышения производительности
428
Методы повышения производительности
430
Методы повышения производительности
431
Раздел 7
CREATE [UNIQUE I BITMAP] INDEX
[имя_схемы. ]имя_индекса
ON {CLUSTER [имя_схемы.]имя_кластера
} | { [имя_схемы. ] имя_таблицы ( имя_столбца , [-••])}
432
Методы повышения производительности
Эффективное кодирование
SQL-выражений
Почти все типичные проблемы, возникающие при на-
стройке производительности, связаны с неэффективным ко-
433
Раздел 7
434 •
Методы повышения производительности
435
Раздел 7
SELECT
SUM(DECODE(SIGN{TO_DATE('01032002','ddmmyyyy')-
At2),-1,0,1)) suml,
SUM(DECIDE(SIGN(At2-
TO_DATE('01032002','ddmmyyyy')),-1,0,
DECODE (SIGiJ(TO_DATE('01042002' ,'ddmmyyyy')-
At2),-1,0,1))) sum2,
SUM(DECODE(SIGN(At2-
TO_DATE( '01042002','ddmmyyyy')),-1,0,1}) sum3
FROM Tab2;
436
Методы повышения производительности
438
Методы повышения производительности
BEGIN
FOR i IN 1..333 LOOP
INSERT INTO Tab2 VALUES(sq$Tab.nextval, . 1);
END LOOP;
FOR 1 IN 1. .333 LOOP
INSERT INTO Tab2 VALUES(sq$Tab.nextval, 2 ) ;
END LOOP;
FOR i IN 1. .334 LOOP
INSERT INTO Tab2 VALUES(sq$Tab.nextval, 3 ) ;
END LOOP;-
COMMIT;..
END;
SQL> COMMIT;
Commit complete.
SQL> COMMIT;
Commit complete.
— результат специального иерархического запроса
1.0 SELECT STATEMENT Z Optimizer: CHOOSE
2.1 SORT (GROUP BY)
3.1 TABLE ACCESS (BY INDEX ROWID) - TAB1
4.1 NESTED LOOPS
5.1 TABLE ACCESS (BY INDEX ROWID) - TAB2
6.1 INDEX(RANGE SCAN)-TAB2$AT2 (NON-UNIQUE)
5.2 INDEX(RANGE SCAN)-TAB1$AT1 (NON-UNIQUE)
7 rows selected.
440
Методы повышения производительности
Подсказка Описание
ORDERED Использование порядка таблиц, указан-
ного в предложении FROM, в качестве
порядка их объединения.
442
Методы повышения производительности
443
Раздел 7
Подсказка Описание
USE NL Использование вложенных циклов.
USE MERGE Использование сортировки со слиянием.
USE HASH Использование hash-объединения.
444
Методы повышения производительности
Секционирование таблиц
Понятие секционирования может иметь много разных
значений. В Oracle подразумевается, что термин секциониро-
вание (partitioning) означает возможность разбиения на раз-
делы (секции) таблиц и индексов. Секции образуют новый
физический уровень архитектуры Oracle, который находится
между таблицей и ее экстентами. При этом таблица отобра-
жается на набор секций, которые в свою очередь, однозначно
отображаются на набор экстентов, а каждый экстент отобра-
жается на одно или несколько табличных пространств с од-
ним или несколькими файлами данных.
Секционирование таблиц и индексов применяется, как
правило, в двух случаях:
— падение производительности при увеличении объемов
обрабатываемых данных;
-'— при проектировании, когда прогнозируется большой
размер создаваемых таблиц.
• '-
Раздел 7
ERROR at line 1:
ORA-14400: inserted partition key does not map to
any partition
447
Раздел 7
448
Методы повышения производительности
Секционирование индексов
В секционированных и несекционированных таблицах
могут использоваться четыре основных типа индексов:
— несекционированный индекс;
— глобальный префиксный индекс;
— локальный префиксный индекс;
— беспрефиксный индекс.
Операции с секциями
Для выполнения всех операций с секциями предусмотре-
но использование двух основных выражений: ALTER TABLE
и ALTER INDEX. Эти выражения обладают следующими
расширениями, предназначенными для работы с секциями: •
Индекс-таблицы
Индекс-таблица — это таблица, которая физически по-
строена в виде двоичного дерева относительно своего пер-
вичного ключа. Oracle, начиная с версии 6, допускает воз-
можность не производить чтение блоков данных таблицы в
тех случаях, когда в запросах на выборку данных использу-
ются только столбцы индекса. Однако при операциях добав-
ления, обновления и удаления записей обязательно должна
была участвовать основная таблица. Начиная с OracleS,.суще-
ствует возможность определить таблицу, которая одновре-
менно является и собственным индексом, что устраняет веде-
ние двух отдельных структур. Как правило, это таблицы с ко-
роткими строками, обращение к которым всегда производит-
ся или по первичному ключу, или полным сканированием.
453
Раздел 7
454
Раздел 8
Объектные расширения
в Oracle8
455
Раздел 8
Объектные типы
Под объектным типом понимается объект базы данных
Oracle, которая объявляет структуру данных (атрибуты) и
разрешенные операции над ней. Объектный тип — это шаб-
лон, по которому можно создавать переменные, таблицы,
столбцы и другие конструкции этого типа. Объектный тип во
многом похож на класс или абстрактный тип данных объект-
но-ориентированного программирования.
456
Объектные расширения в OracleS
460
Объектные расширения в OracleS
461
Раздел 8
ATI AT2.AT2
10 A
462
Объектные расширения в OracleS
463
Раздел 8
SQL> -SELECT sql.NEXTVAL FROM dual;
NEXTVAL
62
Ссылки на объекты
В реляционной модели данных для выражения отноше-
ний между строками разных таблиц используются механизмы
внешних ключей и поддержание ссылочной целостности. Для
объектных расширений предусмотрен другой способ.
Для каждого объекта в таблице объектов Oracle создает
уникальный и неизменный идентификатор объекта. Этот
идентификатор позволяет обращаться к соответствующему
объекту таблицы из другого объекта или реляционной табли-
цы. Гарантируется, что во всей базе данных нет пары объек-
тов с одинаковыми идентификаторами, также гарантируется
повторное неиспользование идентификаторов удаляемых
объектов. Встроенный тип данных, обеспечивающий возмож-
ность использования таких ссылок, называется REF. Пере-
менную типа REF можно использовать для доступа к объекту,
как если бы данная переменная имела бы тот же тип, что и
объект, на который она ссылается.
В OracleS в операторах INSERT и UPDATE используется
конструкция RETURNING, которая позволяет без дополни-
466
Объектные расширения в OracleS
ATI NUMBER
AT2 REF OF OT2
SQL> DECLARE
2 'I_ref_ot2 REF Ot2;
3 BEGIN
4 INSERT INTO Tab2 t
5 VALUES('A','В',EMPTY_BLOB(),SYSDATE)
6 RETURNING REF(t) INTO I_ref_ot2;
7 INSERT INTO ТаЬЗ VALUES (I, I_ref_ot2);
8 END; . .
9 /
467
16*
Раздел 8
I
SQL> DECLARE
2 I_ref_ot2 REF Ot2;
3 I_ot2 Ot2;
4 BEGIN •
5 SELECT At-2 INTO I_ref_ot2
6 FROM Tab3 WHERE At 1=1;
7 SELECT DEREF(I_ref_ot2) INTO I_ot2
468
Объектные расширения в OracleS
8 FROM dual;
9 DBMS_OUTPUT.PUT_LINE(l_ot2.Atl);
10 END;
11 /
A
469
.
Раздел 8
COUNT(*)
COUNT(*)
Массивы
Другим способом для представления отношений между
сущностями являются наборы объектов. OracleS поддержива-
ет два типа наборов. Они описывают набор данных, состоя-
щий из неопределенного числа записей одного типа. Соответ-
ствующие конструкции называются массивами переменной
длины (VARRAY) и вложенными таблицами (NESTED
470
Объектные расширения в OracleS
471
Раздел 8
SQL> DECLARE
2 TYPE m IS VARRAY(26) OF VARCHAR2(1};
3 l_mass m;
4 BEGIN
5 1 mass := m ( ' A ' , ' B ' , ' C 1 , ' D 1 , ' E 1 ) ;
6
DBMS_OUTPUT.PUT_LINE(l_mass(l)||l_mass(2)||l_mass
(3));
7 END;
8 /
ABC
A 1;2;3
B. 4; 5; 6
473
Раздел 8
Вложенные таблицы
Вложенная таблица — это неупорядоченный набор дан-
ных одного типа. Она имеет один столбец встроенного или
определенного пользователем типа. Если этот столбец объ-
ектного типа, то вложенная таблица может рассматриваться
как многостолбцовая таблица со столбцом для каждого атри-
бута типа объекта. Работа с вложенными таблицами очень
похожа на работу с PL/SQL таблицами. Работать с вложен-
ными таблицами можно как с динамическими переменными в
программах на PL/SQL, а также хранить в базе данных. Далее
будем рассматривать вложенные таблицы в базе данных.
При создании таблицы объектов необходимо указать таб-
лицу-хранилище для строк вложенной таблицы. Все вложен-
ные таблицы данной объектной или реляционной таблицы
хранятся в таблице-хранилище. Для разных таблиц объектов
необходимо использовать разные таблицы-хранилища. С точ-
ки зрения реализации отличие между массивами-переменной
длины и вложенными таблицами заключается в том, что дан-
ные вложенных таблиц хранятся в еще одной специальной
таблице, а данные массивов хранятся в той же таблице. При-
мер создания таблицы, тип одного из столбцов которой объ-
явлен как вложенная таблица, приведен ниже. Для хранения
вложенной таблицы используется таблица-хранилище
Tab5 At2 NESTED TABLE.
SQL> UPDATE
2 THE
3 (SELECT At2 FROM Tab5 ,'t
4 WHERE t.At1=10) nt
5 SET nt.At2 ='B';
1 row updated.
10 CURSOR STATEMENT :
CURSOR STATEMENT
ATI AT2
1 A
2 В
477
• •
Раздел 8
Метод Описание
EXISTS Определяет, существует ли
некоторый элемент набора.
COUNT Возвращает число элементов набора.
LIMIT Возвращает максимальное число
элементов набора.
FIRST/LAST Возвращает первый/последний
элемент набора.
NEXT/PRIOR Возвращает элемент набора,
следующий/предыдущий по
отношению к данному элементу.
EXTEND Добавляет элементы к набору.
TRIM Удаляет элементы, начиная с конца
набора.
DELETE Удаляет указанные элементы из
набора.
Спецификации доступа
Спецификации доступа — это директивы компилятора,
запрещающие указанному методу доступ к объектам базы
данных. Их назначение аналогично назначению так называе-
мых "уровней чистоты" для пакетных функций PL/SQL, кото-
рые можно использовать в SQL-запросах (подробно об этом
рассказывается в разделе "PL/SQL — процедурное расшире-
ние языка SQL"). Спецификации доступа перечислены в таб-
лице 38.
Таблица 38. Спецификации доступа
Директива Ограничения
WNDS Данному методу запрещена
модификация данных в таблицах
(представлениях) базы данных.
478
Объектные расширения в OracleS
479
Раздел 8
480
,
'.
Объектные расширения в OracleS
Объектные представления
Объектные представления позволяют обращаться к дан-
ным из реляционных таблиц. Обычно они используются, если
приложение не допускает изменения структуры таблиц и не-
обходимо организовать поддержку объектов в базе данных.
При создании объектного представления с помощью конст-
рукции WITH OBJECT OID указывается идентификатор объ-
екта. В следующем примере данные хранятся в реляционной
таблице ТаЬб, а объектное представление Ovl содержит
один столбец предварительно созданного типа Ot5.
VALUE(V)(ATI, At2)
OT5(1, 'A')
Листинг 259. Пример, иллюстрирующий создание объ-
ектного представления, над реляционной таб-
лицей и выборку объектов из него.
481
Раздел 8
482
Oracle 9i
Как и любая фирма, разрабатывающая программное
обеспечение, Oracle выпускает исправления (патчи) для те-
кущих релизов сервера баз данных и других продуктов и вре-
мя от времени (обычно с интервалом в несколько лет)
представляет новые версии программ. В первой половине
2001 г. (официальное объявление широкой публике
произошло в Англии в декабре 2000 г.) на рынке появилась
версия Oracle 9i. Это событие можно рассматривать гораздо
шире чем обычно, ведь изменениям подвергся не один
конкретный продукт, а все семейство. За словами Oracle 9i
стоят две ключевые технологии: Oracle 9i Application Server и
Oracle 9i Database.
Настоящая книга посвящена технологии баз данных
Oracle и не включает описание инструментальных средств
разработки, сервера приложений, комплексов анализа данных
и т. п. Поэтому остановимся кратко на основных особенно-
стях Oracle 9i Database.
В основном они связываются с хранилищами данных и
аналитической обработкой информации. В состав Oracle 9i
Database включены средства добычи данных (data mining), a
так же средства извлечения, преобразования и загрузки (ETL)
для хранилищ данных. Средства ETL предназначены для
прямого обращения к внешним данным, например к тексто-
вым файлам с помощью обычных SQL-операторов.
Предполагаются и новшества другого порядка. Так, в
Oracle 9i Database должна быть встроена поддержка
возможности персонализации в реальном времени.
Назначение этой возможности связано с позиционированием
сервера баз данных как платформы для электронной
коммерции. Персонализация посетителей Web-узла позволит
выдавать им рекомендации, основываясь на индивидуальных
профилях, хранимых в базе данных, и текущем поведении
пользователей.
483
Нововведения затронули и языковые средства Oracle.
SQL в Oracle 9i соответствует требованиям стандарта ANSI
SQL99. В язык введено много новых синтаксических конст-
рукций. В SQL также появились новые типы данных, напри-
мер, тип TimeStamp дает возможность хранить в базе данных
даты с точностью до долей секунды. Для аналитической об-
работки введены новые статистические функции, позволяю-
щие выполнять операции, ранее специфичные для OLAP-
приложений, например, вычислять параметры тренда или вы-
являть зависимость двух выборок значений случайных вели-
чин.
Изменения появились и в PL/SQL. В основном они кос-
нулись внутренней среды, обеспечивающей эффективное ис-
пользование ресурсов сервера для работы PL/SQL-программ,
но появились и новые операторы, предназначенные, в частно-
сти, для работы с наследованием.
Сервер баз данных стал значительно интеллектуальнее.
Многие рутинные операции администрирования и конфигу-
рирования теперь выполняются автоматически или макси-
мально автоматизированы.
Применение Oracle 9i Database в электронной коммерции
предъявляет повышенные требования к системе безопасно-
сти. Для демонстрации защищенности web-узла, построенно-
го на основе Oracle 9i, корпорация специально провела акцию
"Неуязвимый Oracle", предложив всем,желающим атаковать
свой сайт. Система виртуальных частных баз данных и про-
верка безопасности в контексте приложений предназначены
для активно развивающейся бизнес-схемы сдачи приложений
в аренду.
В завершение краткого изложения в духе "выше, дальше,
быстрее" следует отметить, что основные положения техно-
ло^гий Oracle, представленные в книге, останутся актуальны-
ми и для 91 и для следующих релизов. Дело даже не в том, что
авторам хочется, чтобы их книга была востребованной в те-
чении как можно большего времени, а в том, что уровень
языковых средств и механизмов сервера более чем за 20 лет
484
эксплуатации достиг в некотором смысле совершенства и
вряд ли будет заметно меняться в дальнейшем. Например,
вряд ли для генерации уникальных значений можно приду-
мать механизм, работающий удобнее последовательностей
(sequence). Кроме того, существует огромное количество при-
ложений и баз данных, работающих под управлением млад-
ших версий Oracle, для которых в силу каких-либо причин не
планируется переход на другие версии.
Также хочется отметить, что конкуренция на рынке кор-
поративных СУБД довольно велика и это обстоятельство
иногда заставляет производителей в целях захвата новых сег-
ментов рынка, продвижения новых технологий и т. п. выпус-
кать не до конца доведенные версии программных продуктов.
Первый релиз сервера баз' данных Oracle 9i содержит'серьез-
ные ошибки (например, включение поддержки ANSI-
синтаксиса для внешних соединений привело к тому, что лю-
бой пользователь получает возможность просмотра данных из
любой таблицы). Поэтому, как и для всего нового, требуется
некоторое время для широкомасштабной обкатки Oracle 9i
Database.
Всего же для подробного описания новых возможностей
Oracle 9i потребуется несколько книг. Поэтому специалистам,
желающим системно овладеть этими новыми, стремительно
развивающимися технологиями в области баз данных, можно
порекомендовать прослушать специально построенный набор
курсов в каком-либо авторизованном центре обучения Oracle
в соответствии с выбранной для себя специализацией. В на-
стоящее время в этих центрах существуют программы подго-
товки администраторов, разработчиков приложений, проек-
тировщиков и аналитиков. Вместе с тем хочется отметить,
что все без исключения наборы включают в себя подготовку
по SQL, PL/SQL, разграничению доступа и архитектуре сер-
вера баз данных Oracle. Надеемся, что в изучении этой обяза-
тельной части вам поможет наша книга.
•: , .
485
ЯМ
-
Заключение
Перевернута последняя страница последнего раздела этой
книги. Настала пора подвести некоторые итоги. Прежде все-
го, есть смысл оценить степень усвоения материала книги,
проведя анализ степени достижения целей каждого раздела.
Основная задача, решаемая в первом разделе, — дать об-
щее представление об архитектурах и компонентах распреде-
ленной системы обработки данных. Цель данного раздела
достигнута, если у читателя сформировано четкое представ-
ление об архитектуре сервера Oracle, его основных возмож-
ностях, различных архитектурах информационных систем,
организации локальных сетей, рассматриваемых как основа
распределенных систем обработки данных, общих принципах
конфигурирования сетевых средств Oracle, организации дос-
тупа к серверу базы данных.
Основная цель второго раздела — систематическое изло-
жение языка SQL. Читателя, успешно усвоившего темы вто-
рого раздела, характеризует умение создавать и изменять ос-
новные объекты Oracle и управлять данными.
Читателя, овладевшего материалом третьего раздела, от-
личает умение создавать и отлаживать прикладные програм-
мы на языке PL/SQL. Для эффективной разработки программ
читатель получил сведения о стандартных пакетах, входящих
в комплект поставки сервера.
Полученные в первых трех разделах теоретические пред-
ставления и навыки активно используются при обсуждении
методов и средств разграничения доступа и аудита Oracle,
рассмотренных в четвертом разделе.
• Итогом изучения пятого раздела должно стать умение
написать и интегрировать в систему обработки данных при-
кладную программу на языке Java и построить приложение-
апплет для обеспечения доступа к серверу баз данных на ос-
нове универсального клиента.
486
Шестой раздел должен сформировать понимание концеп-
ции и основных методов обеспечения целостности базы дан-
ных в условиях многопользовательского доступа и умение
использовать соответствующие средства и утилиты Oracle.
Для углубления полученных знаний предназначен седь-
мой раздел о способах, повышающих скорость доступа к дан-
ным. Он должен предоставить знания, необходимые для эф-
фективного применения изученных языковых средств для ра-
боты с большими и сверхбольшими базами данных.
Читатель, изучивший восьмой раздел, ознакомился с ос-
новным направлением развития современных технологий баз
данных. Объектные расширения предлагаются практически
всеми крупными поставщиками решений в этой области и
Oracle не исключение.
Что же делать дальше?
Во-первых, продолжать изучение литературы. В послед-
нее время вышло большое количество книг о современных
технологиях обработки данных в системах промышленного
уровня. Ряд издательств выпускает серии книг, предназна-
ченных для профессиональных разработчиков, проектиров-
щиков, администраторов, других специалистов, работающих
с Oracle. Специальные серии ориентированы на начинающих
пользователей. Издательство "Гелиос" также планирует про-
должить публикации учебных материалов по технологиям и
продуктам Oracle.
Во-вторых, использовать для пополнения и совершенст-
вования своих знаний практически неограниченные инфор-
мационные ресурсы Internet. В настоящее время количество
Web-серверов, содержащих информацию о технологиях и
продуктах Oracle, постоянно увеличивается. Выходят элек-
тронные версии специализированных журналов. В различных
конференциях и форумах можно задать интересующие вопро-
сы или найти готовые решения. Адреса некоторых Web-
ресурсов приведены ниже.
В-третьих, (в перечислении, но не по значимости) посто-
янно практиковаться в решении конкретных задач. Решение
487
бесконечно многообразных и постоянно возникающих задач
обработки информации есть не только способ зарабатывать
на жизнь, но и источник самосовершенствования. Изящное
решение сложных задач, которых множество в сфере обра-
ботки данных, может принести и приносит незабываемое эс-
тетическое наслаждение.
Нам же остается пожелать Вам успехов в освоении и по-
строении систем распределенной обработки информации на
базе технологий Oracle.
Литература
1. Бобровски С. OracleS. Архитектура. — М.: ЛОРИ, 1999.
2. Пейдж Б., ХьюзН., Остин Д. Использование OracleS. —
К.; М.; СПб.: Вильяме, 1998.
3. Баженова И. Ю. Oracle 8/8i. Уроки программирования.
— М.: Диалог-МИФИ, 2000.
4. Урман С. OracleS. Программирование на языке PL/SQL.
— М.: Изд-во ЛОРИ, 1999. .
5. Эбби М., Кори М. OraeleS: Первое знакомство. — М.:
ЛОРИ, 1998.
6. Энсор Д., Стивенсон И. Oracle. Проектирование баз
данных. — К.: BHV, 1999.
7. Koch G., Loney К, OracleS; The complete Reference. —
Osborne/McGraw-Hill, 1997.
8. Theriault M., Heney W. Oracle Security. —
O'Reilly&Associates, Inc., 1998.
Адреса основных Web- серверов Internet, содержащих ин-
формацию о технологиях, продуктах Oracle и опыте их ис-
пользования.
Адрес в сети Internet Описание Web-сервера
www.oracle.com Web-сервер корпорации
Oracle
www.oracle.com/ru/oramag Web-сервер журнала Oracle
Magazine (RE)
www.oracle.ru Web-сервер представительст-
ва корпорации Oracle в РФ
www.fors.ru Web-сервер фирмы ФОРС
(Москва)
www.interface.ru Web-сервер фирмы Interface
Ltd. (Москва)
www.rdtex.ru Web-сервер фирмы RDTeX
(Москва)
Содержание
Азбука Oracle 3
Предисловие ко второму изданию 8
Благодарности ..12
Раздел 1. Архитектура распределенных систем обработки
данных 13
Средства обработки данных: эволюция идей и систем 13
Эволюция реляционных СУБД на фоне истории Oracle 18
OracleS. Основные возможности.. : 20
Архитектуры обработки данных 27
Локальные вычислительные сети как среда передачи данных 33
Эталонная модель взаимодействия открытых систем 35
Компоненты распределенной системы и ЭМВОС..; 41
Конфигурирование сетевых компонент Oracle. 43
Архитектура сервера Oracle 48
Использование инструментального средства SQL*Plus 54
Информация о результатах операции 60
Поддержка мультиязычности в Oracle 62
Соглашения, принятые для описания команд.. 65
Раздел 2. SQL — язык обработки данных Oracle 66
Основные объекты Oracle 67
Средства манипулирования данными языка SQL , 73
Структура запроса 74
Простейшие запросы: 74
Формирование критерия отбора, ..77
Базовые средства определения критерия отбора , 79
Язык описания данных Oracle 81
Типы данных Oracle 82
Строки символов 82
Числовые типы 84
TnnROWID 86
Битовые строки 87
Дата и время 88
LOB-объекты 90
Таблицы. Представления. Пользователи 91
Создание и удаление таблиц в Oracle 91
Средства определения и уничтожения представлений 97
Средства регистрации и исключения пользователей 103
4.91
Операция вставки строк... 107
Операция удаления строк 109
Операция модификации строк ! ; 111
Специальные предикаты SQL 112
Предикат IN 113
Предикат BETWEEN 114
Предикат LIKE 116
Предикат IS NULL 118
Предикат EXISTS 120
Предикаты с кванторами ALL, ANY и SOME 121
Теоретико-множественные операции 122
Внешнее объединение 125
Сортировка 128
Иерархии 130
Группирование и агрегатные функции 133
Синтаксис языка запросов 139
Связи с удаленными базами данных. Снимки данных 143
Создание связей с удаленной базой данных Oracle 143
Средства определения и уничтожения снимков 146
Последовательности. Синонимы 151
Создание последовательностей 151
Создание синонимов в Oracle 157
Работа с табличными областями в Oracle 161
Раздел 3. PL/SQL — процедурное расширение языка SQL..... 165
Структура программы на PL/SQL 166
Переменные, константы и типы„ 167
Управление выполнением программы 169
Оператор ветвления 170
Операторы цикла 171
Оператор GOTO .....174
Курсоры 174
Обработка исключительных ситуаций *... 182
Процедуры, функции и пакеты 188
SQL-функции Oracle 189
Функции, устанавливающие соответствие числовых кодов и
символов 189
Функции преобразования символов подстрок 190
Символьные функции усечения и дополнения строк 192
Символьные функции преобразования строк 194
492
Функции, связанные с выделением подстрок 195
Числовые функции, связанные с возведением в степень и
логарифмированием 197
Тригонометрические функции 198
Числовые функции, связанные с округлениями 200
Числовые функции, связанные со знаком числа 201
Числовые функции, связанные с модулярной арифметикой....202
Функции, оперирующие с датами 203
Функции преобразования типов данных 205
Функции замены аргументов 208
Справочные функции 211
Создание пользовательских процедур и функций 213
Пакеты .-. ; 220
Триггеры базы данных : ....228
Стандартные пакеты Oracle 238
Динамический SQL. , 238
Файловый ввод-вывод ,....: .....245
Управление заданиями 248
Управление LOB-объектами '. 252
Управление многопользовательским доступом 258
Использование функций PL/SQL в SQL-выражениях 262
Раздел 4. Средства разграничения доступа в Oracle 264
Анализ включающей инфраструктуры 266
Идентификация пользователей.. 270
Базовое понятие системы разграничения доступа—
привилегии 272
Предоставление системных привилегий 274
Системные привилегии, определяющие права по работе с
таблицами и представлениями 275
Системные привилегии, определяющие права по работе с
процедурами и триггерами. 279
Системные привилегии, определяющие права по работе с
пользователями 282
Системные привилегии, определяющие права по работе с
табличными областями 283
Системные привилегии, определяющие права по работе с
последовательностями... 285
Системные привилегии, определяющие права по работе с
синонимами 286
' 493
Системные привилегии, определяющие права по
выполнению глобальных действий в системе 288
Системные привилегии, определяющие права по
выполнению действий с остальными объектами БД... 288
Использование конструкции PUBLIC и параметра WITH
ADMIN OPTION , .292
Предоставление привилегий доступа к объекту 295
Управление привилегиями с помощью ролей 300
Системные привилегии, определяющие права по работе с
ролями 301
Предопределенные роли в Oracle 302
Создание ролей и предоставление им привилегий 304
Управление допустимостью использования ролей 305
Отмена привилегий 308
Отмена системных привилегий и ролей 308
Отмена привилегий доступа к объекту, 309
Использование представлений для разграничения доступа 310
Хранимые процедуры как средство разграничения доступа 312
Использование триггеров для повышения защиты системы 314
Средства аудита 319
Аудит системных событий 320
Аудит событий, связанных с доступом к объекту .....327
Прекращение регистрации событий 330
Обработка данных аудита 332
Профили пользователя как средство повышения
защищенности системы 337
Дополнительные сведения....: 340
Раздел 5. Создание приложений на языке Java ..342
Средства построения приложений и организации доступа к
базам данных 342
Создание приложений на языке Java 344
Простейшее приложение на Java 345
Простейший апплет 349
Выполнение SQL-операторов создания таблиц, ввода и
модификации данных ^ 353
Простая выборка данных 357
Параметрические запросы 362
Хранимые процедуры на языке Java 366
494
Раздел 6. Средства обеспечения целостности данных 376
Определение транзакции и ее роль в СУБД , ....378
Начало и окончание транзакции ...379
Предложения SQL, управляющие транзакциями 380
Предложение COMMIT WORK 381
Использование предложения SAVEPOINT ...383
Предложение ROLLBACK WORK 383
Непротиворечивость и параллельная обработка 385
Типы блокировок 391
Ограничения целостности ..393
Массовая загрузка данных 403
Экспорт/импорт данных 409
Раздел 7. Методы повышения производительности 417
Оптимизатор ,..., 418
Ранжирование методов доступа 420
Анализ запросов с целью повышения скорости их выполнения ...423
Задание режима оптимизации 424
Обзор индексов Oracle .......427
Эффективное кодирование SQL-выражений 433
Изменение плана выполнения запроса 437
Секционирование таблиц 445
Секционирование индексов 449
Операции с секциями.... 451
Индекс-таблицы,.... 453
Раздел 8. Объектные расширения в OracleS 455
Объектные типы 456
Объекты в базе данных 461
Ссылки на объекты.. 466
Массивы 470
Вложенные таблицы 474
Спецификации доступа 478
Объектные представления 481
Oracle 9i.. '. , 483
Заключение ....'. 486
Литература 489
Содержание 491
495
•
Учебное издание
Смирнов Сергей Николаевич, Задворьев Иван Сергеевич
Работаем с Oracle
Корректор £ Н. Клитина
ЛР № 066255 от 29.12.98. Издательство «Гелиос АРВ». www.gelios-arv.ru
107014, Москва, Верхняя Красносельская, 16. Тел. (095)264-44-39, e-mail: info@gelios-arv.ru.
Формат 84x108/32. Бумага газетная. 15,5 п. л. Тираж 3 000 экз. Заказ № 1628.
Отпечатано с готовых диапозитивов в РГУП «Чебоксарская типография № 1».
Адрес типографии: 428019, г. Чебоксары, пр. И. Яковлева, 15.