WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!

Pages:     | 1 |   ...   | 4 | 5 || 7 |

«ОФИЦИАЛЬНОЕ АВТОРИЗОВАННОЕ ИЗДАНИЕ ORACLE PRESS™ ЭКСКЛЮЗИВНЫЕ ПРАВА ПРИНАДЛЕЖАТ ИЗДАТЕЛЬСТВУ OSBORNE Программирование на языке PL/SQL Разработка эффективных приложений )мощью PL/SQL OFFICIAL • Oracle ...»

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

Триггеры базы данных Триггеры базы данных и триггеры схемы Системный триггер можно определить на уровне базы данных или на уровне схемы. Триггер базы данных срабатывает каждый раз при наступ лении активизирующего события, а триггер схемы — только когда активи зирующее событие происходит в указанной схеме. Уровень системного триггера определяют ключевые слова DATABASE и SCHEMA. Если с клю чевым словом SCHEMA не указана схема, то по умолчанию используется та, которой принадлежит триггер. Предположим, что пользователь создает следующий триггер:

— Этот пример содержится в файле CREATE OR REPLACE TRIGGER AFTER LOGON ON SCHEMA BEGIN INSERT INTO VALUES (1, END LogUserAConnects;

LogUserAConnects вносит запись в всякий раз, когда UserA сое диняется с базой данных. Создадим аналогичный триггер для пользователя Г] Этот пример содержится в файле CREATE OR REPLACE TRIGGER LogUserBConnects AFTER LOGON ON SCHEMA BEGIN INSERT INTO VALUES (2, END LogUserBConnects;

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

Г] — Этот пример содержится в файле CREATE OR REPLACE TRIGGER LogAllConnects AFTER LOGON ON DATABASE BEGIN INSERT INTO example.

VALUES (3. fired!

END LogAllConnects;

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

Г] — Этот пример содержится в файле SQL> connect connect UserB/UserB connect example/example SQL> SQL> SELECT * FROM 3 LogAllConnects fired!

2 fired!

3 LogAllConnects fired!

3 LogAllConnects fired!

1 fired!

Как и предполагалось, LogAllConnects активизировался три раза (по разу для каждого из трех соединений), a LogUserAConnects и LogUserBConnects только по разу.

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

функции событий Существует ряд атрибутных функций, которые разрешается использовать в системных триггерах. Подобно предикатам (INSERTING, UPDATING и DELETING), они позволяют получать информацию об ак тивизирующем событии в теле триггера. Хотя эти функции можно вызы вать и из других блоков PL/SQL (не только в теле системного триггера), возвращаемый ими результат не всегда будет достоверным. Атрибутные функции событий описаны в таблице Таблица Атрибутные функции событий Атрибутная Тип данных Для каких системных Описание функция событий применима VARCHAR2(20) Все события Возвращает системное событие, активизировавшее триггер.

NUMBER Все события Возвращает номер текущего экземпляра базы данных. Если не функционирует Oracle Real Application Clusters, всегда будет возвращать 1.

VARCHAR2(50) Все события Возвращает имя текущей базы данных.

Триггеры данных Таблица Атрибутные функции событий Атрибутная Тип данных Для каких системных Описание функция событий применима SERVER ERROR NUMBER SERVERERROR Получает один числовой аргумент.

Возвращает ошибку в позиции в стеке ошибок, указанной аргументом. Вершина стека — 1.

IS SERVERERROR BOOLEAN SERVERERROR Получает номер ошибки в качестве аргумента и возвращает TRUE, если указанная ошибка Oracle присутствует в стеке ошибок.

LOGIN USER VARCHAR2(30) Все события Возвращает идентификатор пользователя, активизировавшего триггер.

DICTIONARY OBJ VARCHAR2(20) CREATE, DROP, ALTER Возвращает тип объекта словаря, TYPE над которым выполнялась операция DDL, активизировавшая триггер.

DICTIONARY OBJ VARCHAR2(30) CREATE, DROP, ALTER Возвращает имя объекта словаря, NAME над которым выполнялась операция DDL, активизировавшая триггер.

DICTIONARY OBJ CREATE, DROP, ALTER Возвращает владельца того OWNER объекта словаря, над которым выполнялась операция DDL, активизировавшая триггер.

DES VARCHAR2(30) CREATE USER Возвращает зашифрованный по PASSWORD или ALTER USER стандарту DES пароль создаваемого или изменяемого пользователя.

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

Решить эту проблему можно с помощью процедуры Даже если сам триггер не приводит к ошибке, эта процедура обеспечивает доступ к стеку ошибок в PL/SQL. Приведем пример, где ошибки регистрируются в следующей таблице:

Г) — Этот пример содержится в файле CREATE TABLE ( DATE, VARCHAR2(30), instance NUMBER, VARCHAR2(50), error_stack VARCHAR2(2000) 430 ГЛАВА Создадим триггер, который вводит информацию в error_log:

Г) -- Этот пример содержится в файле CREATE OR REPLACE LogErrors AFTER SERVERERROR ON BEGIN INSERT INTO error_log VALUES (SYSDATE, SYS.

END LogErrors;

Сгенерируем несколько ошибок и посмотрим, правильно ли регистрирует их. Обратите внимание: триггер отслеживает ошибки SQL, ошибки этапа выполнения PL/SQL и ошибки этапа компиляции PL/SQL.

Г) — Этот пример содержится в файле SQL> SELECT * FROM SELECT * FROM * ERROR at line table or view does not exist (таблица или представление не существует) SQL> BEGIN 2 INSERT INTO VALUES 3 END;

4 / INSERT INTO non_existent_table VALUES * ERROR at line 2:

line 2, column 15:

identifier be declared ORA-06550: line 2, 3:

PL/SQL: SQL Statement ignored (Идентификатор должен быть объявлен.

SQL-оператор SQL> BEGIN 2 - Это синтаксическая ошибка!

3 DELETE FROM students 4 END;

5 / END;

* ERROR at line 4:

ORA-06550: line 4, column Encountered the "END" when expecting one of the following:

. 9 ;

return

Триггеры базы данных (Встретился символ "END", когда ожидался один из следующих:. ;

return <идентификатор> в двойных partition where.

Для продолжения работы "END" заменен символом DECLARE 2 v_StringVar 3 BEGIN 4 -- Это ошибка времени выполнения!

5 := ;

6 END;

7 / DECLARE * ERROR at line 1:

ORA-06502: PL/SQL: numeric or value error: character string buffer too at SQL> SELECT * 2 FROM INSTANCE DATABASE ERROR_STACK 12-OCT-01 EXAMPLE 1 V table or view does not exist EXAMPLE 1 V line 2, 15:

identifier must be declared ORA-06550: line 2, column PL/SQL: SQL Statement ignored 12-OCT-01 EXAMPLE 1 V ORA-06550: line 4, column Encountered the symbol "END" when expecting one of the. ;

return

12-OCT-01 EXAMPLE 1 V ORA-06502: PL/SQL: numeric or value error: character string buffer too small at line Системные триггеры и транзакции В зависимости от активизирующего события транзакционное поведение системного триггера меняется. Системный триггер срабатывает или как отдельная завершающаяся после успешного выполнения триггера, или как часть текущей транзакции пользователя. Триггеры 432 STARTUP, SHUTDOWN, и LOGON активизируются как отдельные транзакции, а триггеры LOGOFF и DDL — как часть текущей транзакции.

Важно отметить, что работа, выполняемая триггером, как правило, за вершается оператором COMMIT. В случае с триггером DDL текущая транзакция (а именно оператор CREATE, ALTER или DROP) завершается автоматически, что завершает и действие триггера. Результаты работы триггера LOGOFF также фиксируются в заключительной транзакции сеанса.

Внимание Системные триггеры практически всегда завершаются оператором COMMIT, поэтому объявление их автономными не будет иметь никакого эффекта.

Системные триггеры и предложение WHEN В системных триггерах, как и в триггерах DML, для указания условия акти визации можно применять конструкцию WHEN (когда). Однако существу ет ряд ограничений на виды условий, указываемых в системных триггерах:

В триггерах STARTUP и SHUTDOWN никаких условий ставить нельзя.

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

• В триггерах LOGON и LOGOFF можно проверять идентификатор и имя пользователя с помощью тестов и USERNAME.

• В триггерах DDL можно проверять тип и имя модифицируемого объекта, а также идентификатор и имя пользователя.

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

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

Для триггеров же определено собственное пространство имен, т.е.

триггер может иметь то же имя, что и какая-либо таблица или процедура.

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

Проиллюстрируем это на примере сеанса работы в -- Этот пример содержится в файле -- Разрешено, так как пространства имен триггеров и таблиц SQL> -- различны.

CREATE OR REPLACE TRIGGER major_stats 2 BEFORE INSERT ON 3 BEGIN 4 INSERT INTO VALUES fired!

6 END major_stats;

7 / Trigger created.

SQL> -- Запрещено, так как пространства имен процедур и таблиц -- одинаковы.

CREATE OR REPLACE PROCEDURE AS BEGIN 3 INSERT INTO (char_col) 4 VALUES 5 END major stats;

6 / CREATE OR REPLACE PROCEDURE AS * ERROR at line 1;

ORA-00955: name is already used by an existing object (имя уже используется существующим объектом) Совет Хотя не запрещается применять для таблицы и триггера одинаковые имена, делать это не рекомендуется. Лучше дать каждому триггеру уникальное имя, показывающее, какие функции он выполняет или для какой таблицы он Можно также предварять имена триггеров некоторой последовательностью символов (например, Ограничения, налагаемые на триггеры Тело триггера является блоком PL/SQL (в разрешены другие типы тел триггеров, см. ниже). Любой оператор, выполнение которого разрешено в блоке PL/SQL, можно выполнить и в теле триггера при условии соблюдения следующих ограничений:

• В триггере нельзя использовать операторы управления транзакция ми: COMMIT, и SET TRANSACTION. Ком пилятор PL/SQL позволит создать триггер, содержащий один из этих операторов, но при активизации триггера будет выдано сообще ние об ошибке. Дело в том, что срабатывание триггера является ча стью процесса выполнения активизирующего оператора, т.е. частью той транзакции, которая охватывает активизирующий оператор.

434 ГЛАВА Когда этот оператор завершается или откатывается, все то, что было выполнено триггером, также завершается или откатывается (в можно создать триггер, исполняющийся как автоном ная транзакция, и его работа будет завершаться или откатываться независимо от состояния активизирующего оператора, см. главу 4).

• В процедурах и функциях, которые вызываются в теле тоже нельзя задавать никаких операторов управления транзакция ми (если они не объявлены автономными в г и • В теле триггера нельзя объявлять переменные типов LONG и LONG RAW. Кроме того, в записях new и : old нельзя ссылаться на столбцы типов LONG и LONG RAW таблицы, для которой опреде лен триггер.

• В и выше из тел триггеров можно обращаться к столбцам типа LOB (большие но модифицировать значения этих столбцов нельзя. Это ограничение действует и для столбцов-объектов.

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

Тело триггера До телом триггера мог быть только блок PL/SQL. В тело триггера может содержать оператор GALL. Вызываемая процедура может быть хранимой подпрограммой SQL либо оболочкой подпрог раммы С или Java. Это позволяет создавать триггеры, функциональные конструкции которых написаны на Java. Предположим, что необходимо регистрировать моменты соединения с базой данных и отключения от нее в следующей таблице:

-- Этот пример содержится в файле CREATE TABLE ( operation DATE);

Для этого воспользуемся таким модулем:

..- Этот пример содержится в файле CREATE OR REPLACE PACKAGE LogPkg AS PROCEDURE LogConnect(p_UserID IN VARCHAR2);

PROCEDURE VARCHAR2);

END LogPkg;

CREATE OR REPLACE PACKAGE LogPkg AS PROCEDURE IN VARCHAR2) IS BEGIN INSERT INTO operation, timestamp) VALUES (p_USerID, SYSDATE);

Триггеры базы данных END LogConnect;

PROCEDURE VARCHAR2) IS BEGIN INTO operation, VALUES (p_USerID, SYSDATE);

END END Как в LogConnect, так и в LogDisconnect аргументом явля ется имя и обе процедуры вводят по строке в Вызовем их из триггеров LOGON и LOGOFF:

— Этот пример содержится в файле CREATE OR REPLACE TRIGGER LogConnects AFTER LOGON ON DATABASE CALL USER) / CREATE OR REPLACE TRIGGER LogDisconnects BEFORE LOGOFF ON DATABASE CALL LogPkg.

Внимание Триггеры LogConnects и LogDisconnects являются системными триггерами базы данных (а не схемы), поэтому для их создания необходимо иметь системную привилегию ADMINISTER DATABASE TRIGGER.

Тела триггеров LogConnects и LogDisconnects — это операторы CALL, вызывающие процедуру для исполнения. Текущий пользователь переда ется как единственный аргумент. В рассмотренном примере вызывается стандартная модульная процедура PL/SQL, но точно так же можно было бы вызвать оболочку внешней подпрограммы С или Java. Предположим, что в базу данных загружается следующий класс Java:

— Этот пример содержится в файле java import import public class Logger { public static void LogConnect(String throws SQLException { JDBC-соединение по умолчанию.

Connection conn = new OracleDriver().defaultConnection();

String insertString = "INSERT INTO connect_audit (user_name, operation, timestamp)" + VALUES // Подготовим и выполним оператор ввода данных.

436 ГЛАВА PreparedStatement = conn.

public static userlD) throws SQLException { // Установим по умолчанию.

Connection conn = new String insertString = "INSERT INTO connect_audit operation, + VALUES // Подготовим и выполним оператор ввода данных.

PreparedStatement insertStatement = userlD);

Создадим для этого класса оболочку LogPkg:

— Этот пример содержится в файле CREATE OR REPLACE PACKAGE LogPkg AS PROCEDURE LogConnect(p_UserID IN VARCHAR2);

PROCEDURE LogDisconnect(p_UserID IN VARCHAR2);

END LogPkg;

CREATE OR REPLACE PACKAGE BODY LogPkg AS PROCEDURE LogConnect(p_UserID IN IS LANGUAGE JAVA NAME PROCEDURE VARCHAR2) IS LANGUAGE JAVA NAME ' Logger. LogDisconnect(java. lang.

END LogPkg;

Теперь можно воспользоваться теми же самыми триггерами для полу чения нужного результата (см. главу 12).

Внимание предикаты INSERTING, UPDATING и DELETING, а также идентификаторы корреляции и : (и : parent) можно использовать только тогда, когда тело триггера является полноценным блоком но не оператором CALL Триггеры базы данных Привилегии на триггеры По отношению к триггерам применимы пять системных привилегий (см. таблицу 11.6). Кроме них, владелец триггера должен иметь объект ные привилегии, необходимые для работы с объектами, на которые ссы лается триггер. Поскольку триггер — компилируемый объект, эти привилегии должны предоставляться напрямую, а не через роль.

Таблица Системные привилегии, имеющие отношение к триггерам Системная привилегия Описание CREATE TRIGGER Позволяет обладателю создавать триггер в своей схеме.

CREATE ANY TRIGGER Позволяет обладателю создавать триггеры в любой схеме за исключением SYS. Не рекомендуется создавать триггеры для таблиц словаря данных.

ALTER ANY TRIGGER Позволяет обладателю разрешать, запрещать и компилировать триггеры базы данных в любой схеме за исключением Заметим, что если обладатель этой привилегии не имеет привилегии CREATE ANY TRIGGER, он не может изменять программный текст триггера.

DROP ANY TRIGGER Позволяет обладателю удалять триггеры базы данных в любой схеме за исключением ADMINISTER DATABASE Позволяет обладателю создавать и изменять системные триггеры TRIGGER базы данных (а не только текущей схемы). Обладатель этой привилегии должен иметь также привилегию CREATE TRIGGER или CREATE ANY TRIGGER.

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

Представления словаря данных При создании триггера его исходный текст сохраняется в представлении словаря данных В этом представлении содержится тело условие WHEN, активизирующая таблица и тип триггера. На пример, в следующем запросе возвращается информация о триггере SQL> SELECT trigger_type, triggering_event 2 FROM 3 WHERE TRIGGER TYPE TABLE NAME TRIGGERING EVENT AFTER STATEMENT STUDENTS INSERT OR UPDATE OR DELETE Представление user_triggers содержит информацию о триггерах, при надлежащих текущему пользователю. Существуют еще два представления:

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

Более подробно о представлениях словаря данных рассказывается в при ложении С.

Удаление и запрещение триггеров Триггеры, как и процедуры и модули, можно удалять. Синтаксис команды удаления триггера таков:

DROP TRIGGER где — имя удаляемого триггера. При этом триггер удаляется из словаря данных. В операторе создания триггера можно указывать ключевые слова OR REPLACE, как это делается для подпрограмм. В этом случае если триггер существует, то сначала он удаляется.

Однако в отличие от процедур и функций можно, не удаляя триггер, запретить (DISABLE) его использование. Запрещенный триггер находит ся в словаре данных, но никогда не активизируется. Для запрещения триггера применяется оператор ALTER TRIGGER:

ALTER TRIGGER | При создании триггера его использование разрешено (ENABLE) по умолчанию. С помощью оператора ALTER TRIGGER можно запретить, а затем повторно разрешить любой триггер. Ниже приведен пример запре щения и повторного разрешения триггера SQL> ALTER TRIGGER UpdateMajorStats Trigger altered.

SQL> ALTER TRIGGER UpdateMajorStats ENABLE;

Trigger altered.

Кроме того, при помощи команды ALTER TABLE можно разрешить или запретить использование всех триггеров определенной таблицы, если добавить конструкцию ENABLE ALL TRIGGERS (разрешить все триггеры) или DISABLE ALL TRIGGERS (запретить все триггеры). Например:

SQL> ALTER TABLE students 2 ENABLE ALL TRIGGERS;

Table altered.

SOL> ALTER TABLE students 2 DISABLE ALL TRIGGERS;

Table altered.

В столбце status представления user_triggers находится либо либо и это значение показывает, каково текущее состояние триггера. Запрещение триггера не удаляет его из словаря дан ных, как это происходит при выполнении команды DROP.

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

Изменяющиеся таблицы Не ко всем таблицам и столбцам можно обращаться из тела триггера. В этом контексте необходимо различать изменяющиеся и ограничивающие таблицы. Изменяющаяся (mutating table) — это таблица, которая в данный момент модифицируется оператором DML. Для триггера это таб лица, для которой он был создан. Таблицы, которые обновляются в резуль тате реализации ограничений ссылочной целостности DELETE CASCADE (каскадное также являются изменяющимися (см. "Oracle Server Reference"). Ограничивающая таблица (constraining table) — это таблица, ин формация которой может быть считана при реализации ограничения ссы лочной целостности. Поясним это определение на примере таблицы Г) Этот пример содержится в файле CREATE TABLE ( student_id • NOT NULL, department CHAR(3) NOT NULL, course NUMBER(3) NOT NULL, grade CHAR(1), CONSTRAINT CHECK (grade IN CONSTRAINT FOREIGN KEY REFERENCES students (id), CONSTRAINT FOREIGN KEY course) REFERENCES classes (department, course) Для таблицы registered_students установлены два ограничения ссы лочной целостности. Таблицы students и classes являются ограничиваю щими по отношению к registered_students. Их информацию, возможно, потребуется модифицировать и/или считать оператором DML. Таблица registered_students тоже изменяется во время выполнения над ней опера тора SQL-операторы в теле триггера не могут:

440 ГЛАВА • Считывать или модифицировать информацию таблицы, изменяющей ся в результате выполнения активизирующего оператора. В число таких таблиц входит и сама активизирующая таблица.

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

Эти правила справедливы для всех строковых триггеров. Для оператор ных триггеров они применимы только в тех случаях, когда те ся в результате выполнения операции каскадного удаления информации (DELETE Внимание Если оператор INSERT воздействует только на одну строку, то для строковых триггеров BEFORE и AFTER, работающих с данной строкой, активизирующая таблица не является изменяющейся. Это единственная ситуация, когда строковый триггер может считывать и модифицировать информацию активизирующей таблицы. Для таких операторов, как INSERT INTO table SELECT активизирующая таблица всегда является изменяющейся, даже если в подзапросе возвращается только одна строка.

В качестве примера рассмотрим триггер Он модифи цирует таблицы students и classes, тем не менее так как моди фицируемые столбцы таблиц students и classes не являются ключевыми столбцами. Пример недопустимого триггера будет рассмотрен в следую щем разделе.

Этот пример содержится в файле CREATE OR REPLACE TRIGGER CascadeRSInserts /* Поддерживает синхронизацию таблиц registered_students, students и classes при выполнении операции INSERT над */ BEFORE INSERT ON FOR EACH ROW DECLARE v_Credits BEGIN - Определим число зачетов для данной группы.

SELECT INTO v_Credits FROM classes WHERE department = AND course = - Модифицируем текущее число для данного студента.

UPDATE students SET current_credits = current_credits + v_Credits Триггеры базы данных WHERE ID = - Добавим единицу к числу студентов в группе.

classes SET = + WHERE department = AND course = END CascadeRSInserts;

Пример изменяющейся таблицы Предположим, что требуется ограничить общее число студентов, занима ющихся каждой из дисциплин, пятью учащимися. Это можно сделать, если создать для таблицы students строковый триггер BEFORE INSERT или UPDATE:

— Этот пример содержится в файле CREATE OR REPLACE TRIGGER LimitMajors /* Ограничивает общее число студентов, занимающихся каждой из дисциплин, значением 5. Если этот предел превышается, то посредством raise_application_error устанавливается ошибка. */ BEFORE INSERT OR UPDATE OF major ON students FOR EACH ROW DECLARE CONSTANT NUMBER := 5;

NUMBER;

BEGIN - Определим текущее число студентов, занимающихся данной SELECT INTO FROM students WHERE major = - Если места недостаточно, установим ошибку.

IF v_CurrentStudents + 1 > v_MaxStudents THEN many students in major ' || END IF;

END LimitMajors;

На первый взгляд кажется, что при выполнении этого триггера будет получен желаемый результат. Однако если обновить students и активизи ровать триггер, результат будет таким:

— Этот пример содержится в файле SQL> students 2 SET major = 3 WHERE ID = 10003;

UPDATE students ERROR at line 442 ГЛАВА table is mutating, trigger/function may not see it at line error during execution of trigger EXAMPLE.

(ORA-04091: таблица является возможно, не видит ее.

ORA-04088: ошибка во время выполнения триггера Ошибка возникает в результате того, что триггер обращается к собственной активизирующей таблице, которая изменяется.

устанавливается при активизации, а не при создании триггера.

Как избежать связанных с изменяющимися таблицами Таблица students является изменяющейся только для строкового триггера.

Это означает, что в строковом триггере обратиться к ней с запросом нель зя, но это можно сделать в операторном триггере. Однако просто взять и преобразовать триггер о rs в операторный нельзя, поскольку в теле триггера используется значение : new. Эту проблему можно решить, если создать два триггера — строковый и операторный. В триг гере будет записываться значение : new. но таблица students ваться не будет. Этот запрос будет выполняться в операторном триггере, причем будет использоваться значение, записанное в строковом триггере.

Как записать это значение? Одним из способов является применение таблицы PL/SQL внутри программного модуля. При этом можно сокра тить число значений, обрабатываемых во время каждой операции обнов ления данных. Кроме того, для каждого соединения создается свой собственный экземпляр модульных переменных, поэтому не надо беспо коиться о том, как будет выполняться обновление информации одновре менно различными соединениями. Такой метод реализуется при помощи модуля и триггеров RLimitMajors — Этот пример содержится в файле CREATE OR REPLACE PACKAGE StudentData AS TYPE t_Majors IS TABLE OF INDEX BY BINARY_INTEGER;

TYPE t_IDs IS TABLE OF students.

INDEX BY BINARY_INTEGER;

v_StudentMajors t_Majors;

v_StudentIDs t_IDs;

BINARY_INTEGER := 0;

END StudentData;

CREATE OR REPLACE TRIGGER RLimitMajors BEFORE INSERT OR UPDATE OF major ON students FOR EACH ROW BEGIN /* Запишем новые данные в StudentData. В таблицу students Триггеры базы данных изменения вносить не будем, избежать */ := 1;

: = StudentData.

CREATE OR REPLACE TRIGGER AFTER INSERT OR UPDATE OF major ON students DECLARE CONSTANT NUMBER := 5;

v_CurrentStudents NUMBER;

v_Major BEGIN /* В цикле просмотрим обновленные и измененные записи о студентах и проверим, соблюдается ли установленное условие. */ FOR IN LOOP v_StudentID := -- Определим текущее число студентов, занимающихся данной дисциплиной.

SELECT INTO v_CurrentStudents FROM students WHERE major = - Если места недостаточно, установим ошибку.

IF v_CurrentStudents > THEN RAISE_APPLICATION_ERROR(-20000, many students for major ' v_Major ' because of student ' END IF;

END LOOP;

- Сбросим счетчик, чтобы при следующем выполнении триггера -- использовались новые данные.

:= 0;

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

Теперь можно проверить работу этих Будем обновлять таб лицу students до тех пор, пока не окажется слишком много студентов, профилирующей дисциплиной которых является история:

— Этот пример содержится в файле SQL> UPDATE students 2 SET major = 3 WHERE ID = 10003;

444 ГЛАВА 1 row updated.

SQL> UPDATE students 2 SET major = 3 WHERE ID = 10002;

1 row updated.

UPDATE students 2 SET major = 3 WHERE ID = 10009;

UPDATE students * ERROR at line ORA-20000: Too many students of major History because of student at line ORA-04088: error during execution of trigger (ОШИБКА в строке ORA-20000: Слишком много студентов-историков из-за студента ORA-06512: в строке ORA-04088: ошибка во время выполнения триггера Итак, получен нужный результат. Такой метод может применяться при возникновении ошибки когда строковый триггер считы вает или модифицирует информацию изменяющейся таблицы. Вместо некорректного строкового триггера для обработки данных используется правильный операторный триггер AFTER. Для хранения модифициро ванных строк служат модульные таблицы PL/SQL.

При анализе этого примера необходимо обратить внимание на следующее:

• Таблицы PL/SQL содержатся в модуле, поэтому они будут видимы как строковому, так и операторному триггеру. Единственным способом, гарантирующим то, что используемые переменные будут глобальны ми, является размещение их в модуле.

• Здесь используется переменная-счетчик v_NumEntries.

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

• Проверка максимального числа студентов, занимающихся опреде ленной дисциплиной, немного изменена в Дело в том, что теперь это операторный триггер AFTER, и в v_CurrentStudents будет храниться число студентов, которое получено не до, а после выполнения операции ввода или обновления данных. Именно поэ тому проверка числа + выполняемая в триггере заменена проверкой v_CurrentStudents.

Триггеры базы данных Вместо таблицы PL/SQL можно было бы воспользоваться таблицей базы данных. Автор не рекомендует этого делать, поскольку соеди нения, одновременно выполняющие операторы UPDATE, могут ме шать работе друг друга (в и выше можно применять временные таблицы). Модульные таблицы PL/SQL являются уника льными для сеансов, и с их помощью можно избежать возникнове ния таких проблем.

Итоги Триггеры являются важным элементом PL/SQL и Oracle. Их можно ис пользовать для реализации более сложных ограничений данных, чем обычные ограничения ссылочной целостности. В функции триг геров расширены, они активизируются не только операциями DML, вы полняемыми над таблицами и представлениями, но и различными событиями. В заключительной главе рассматриваются некоторые более сложные средства PL/SQL.

ГЛАВА Дополнительные возможности 448 ГЛАВА главах с 3 по 11 рассматривались базовые возможности PL/SQL. В В этой главе кратко обсуждается ряд развитых средств. Дополнительную информацию об этих средствах можно найти в книге г: новые возможности программирования на языке PL/SQL" (изд. "Лори") и в до кументации Oracle.

Свойства языка В этом разделе кратко рассматриваются некоторые из развитых возмож ностей PL/SQL, встроенных в язык. Сюда входят внешние подпрограм мы, встроенный динамический SQL, массовые связывания (bulk binds), объектные типы, большие объекты, канализированные и табличные функции.

Внешние подпрограммы PL/SQL особенно подходит для работы с Oracle благодаря своей интег рации с SQL. Фактически, именно для этого язык и был создан. Для иных задач предназначаются другие языки программирования. Например, С хорошо подходит для задач с большим объемом вычислительной работы и для интеграции с файловой системой и другими системными устройст вами. Java является прекрасным переносимым языком с хорошо опреде ленной моделью безопасности, применяемой в приложениях Интернета.

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

До единственным способом коммуникации между PL/SQL и другим языком (таким, как С) было использование модулей и/или Обычно это требовало настройки процесса-демо на, написанного с помощью (Oracle Call Interface — интерфейс вызо ва Oracle) или прекомпиляторов.

В коммуникации были упрощены за счет применения внешних подпрограмм. Внешняя подпрограмма — это процедура или функция, напи санная на языке, отличном от PL/SQL, но вызываемая из программы PL/SQL. Это делается путем публикации внешней подпрограммы в PL/SQL с помощью вызываемой в PL/SQL точки входа (называемой так же которая отображается в реальный внешний код. Программа PL/SQL вызывает затем оболочку, которая в свою очередь вызывает внеш ний код. Внешние подпрограммы были первоначально введены в (где они назывались внешними В единственным под держиваемым языком для внешних подпрограмм был С. Для создания оболочки PL/SQL применялось предложение AS EXTERNAL.

возможности i расширил механизм внешних подпрограмм для поддержки Java.

Оболочки PL/SQL также были расширены для включения специфика ций вызова. вызова является средством публикации внешней подпрограммы (независимо от ее собственного языка программирования) в PL/SQL. Спецификации вызова используют предложение AS LANGUAGE.

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

Предположим, что написана С-функция с использованием прототипа следующего вида:

int sendMail( char char char char Если эта функция компилируется в общую библиотеку в файловой сис теме, скажем, в то затем можно создать объект библио теки для представления расположения общего объекта:

CREATE OR REPLACE LIBRARY AS После создания библиотеки можно создать оболочку:

CREATE OR REPLACE PROCEDURE SendMailC ( IN VARCHAR2, p_Message IN VARCHAR2, IN VARCHAR2, p_Recipient IN VARCHAR2) AS EXTERNAL LIBRARY SendMailLibrary NAME "sendMail" PARAMETERS STRING, p_Message STRING, p_From STRING, STRING);

Предложение AS EXTERNAL указывает имена библиотеки и функции С, а предложение PARAMETERS определяет отображение между типами данных PL/SQL и С. После завершения этих действий можно вызвать подпрограмму SendMailC из PL/SQL. Это в свою очередь будет приводить к вызову С-функции sendMail, которая и отправит сообщение.

450 ГЛАВА Внешние подпрограммы С выполняются в отдельном процессе. При вызове внешней подпрограммы сервер автоматически запускает процесс, называемый extproc (используя информацию из конфигурационных фай лов Net8). Затем extproc загружает общую библиотеку, указанную в пред ложении LIBRARY, и вызывает функцию.

Внешние подпрограммы Java Для внешних подпрограмм Java в базу данных загружается класс Java (он будет выполняться виртуальной машиной Java базы данных Oracle). Как и в случае внешней подпрограммы С, нужно создать оболочку, чтобы PL/SQL мог ее вызвать. В отличие от подпрограмм С, в операционной системе не создается библиотека и настройка приемника не требуется.

Предположим, что класс Java и метод создаются следующим образом:

public class sendMail { public static void send ( String subject, String message, String from, String recipient) Из PL/SQL можно вызывать только статические методы, а эти мето ды могут вызывать другие нестатические методы, также загруженные в базу данных. После загрузки этого класса в базу данных можно создать оболочку PL/SQL:

CREATE OR REPLACE PROCEDURE IN VARCHAR2, p_Message IN VARCHAR2, IN VARCHAR2, IN AS LANGUAGE JAVA NAME Предложение NAME определяет сигнатуру метода Java, который будет вызываться. Отметим, что в методе необходимо использовать полные имена типов данных. Аналогично оболочке для подпрограммы С, после создания класса можно вызывать его из подпрограмм PL/SQL, что будет в свою очередь вызывать Java-метод который и отправит сообщение.

В отличие от внешних подпрограмм С, внешние подпрограммы Java выполняются непосредственно в базе данных. Содержащаяся на сервере виртуальная машина Java будет выполнять метод Java напрямую. Нет не обходимости вызывать extproc.

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

Существуют два способа выполнения динамического SQL в PL/SQL.

Первый применяет модуль DBMS_SQL (см. ниже раздел "Дополнитель ные Второй способ был введен в и предлагает исполь зование встроенного динамического SQL. Встроенный динамический SQL является составной частью самого языка. Вследствие этого он значи тельно проще в применении и быстрее, чем модуль DBMS_SQL.

Блоки PL/SQL и выполнение операторов, не содержащих запросов Базовым оператором, используемым в не содержащих запросов операторах (DML и DDL) и блоках PL/SQL, является оператор EXECUTE IMMEDIATE.

Приведем пример сеанса SQL*Plus:

Г] — Это пример содержится в файле DECLARE 3 VARCHAR2(200);

4 BEGIN 5 - Используя литерал, создадим временную таблицу. Отметим, что 6 - в строке нет завершающей точки с запятой.

7 EXECUTE IMMEDIATE 8 TABLE execute_table (call 10 - Вставим несколько строк таблицы, используя строку символов. Здесь также 11 - нет завершающей точки с запятой в строке.

12 FOR v_Counter IN LOOP 13 := 14 INTO 15 VALUES v_Counter 16 EXECUTE IMMEDIATE 17 END LOOP;

19 - Напечатаем содержимое таблицы с помощью анонимного блока PL/SQL.

20 - Здесь целый блок помещается в одну строку символов 21 - (включая точку с запятой).

22 v_PLSQLBlock := 24 FOR v_Rec IN (SELECT * FROM LOOP 26 END LOOP;

29 - А теперь выполним анонимный блок.

30 EXECUTE IMMEDIATE v_PLSQLBlock;

32 -- Удалим таблицу.

33 EXECUTE IMMEDIATE TABLE 34 END;

35 / Row Row Row Row Row Row Row Row Row Row PL/SQL procedure successfully completed.

В этом примере показаны различные способы использования EXECUTE IMMEDIATE: для выполнения DDL, DML и анонимных блоков PL/SQL.

Выполняемая строка может задаваться как литерал, заключенный в оди ночные кавычки (операторы CREATE TABLE и DROP TABLE) или как пе ременная типа символьной строки PL/SQL (оператор INSERT и анонимные блоки). Отметим, что завершающая точка с запятой не нужна для операторов DML и DDL, но указывается для анонимных блоков.

EXECUTE IMMEDIATE используется также для выполнения операторов со связанными переменными. В этом случае выполняемая строка содержит позиции, помеченные двоеточием. Позиции предназначены для размещения переменных PL/SQL, которые указываются в предложении USING оператора EXECUTE IMMEDIATE, например:

— Этот пример содержится в файле DECLARE v_SQLString v_PLSQLBlock CURSOR IS SELECT * FROM students WHERE major = BEGIN - Вставим ECN 103 в таблицу classes, используя строку символов - для оператора SQL.

INTO CLASSES (department, course, description, current_students, :descr, :cur_s, возможности - Выполним оператор INSERT, используя литеральные значения.

EXECUTE IMMEDIATE USING 103, 10, 0, 3;

- Зарегистрируем выбравших Economics в новой группе.

FOR IN LOOP - Здесь мы имеем литеральный оператор SQL, а переменные PL/SOL - находятся в предложении USING.

ECECUTE IMMEDIATE INTO (student_ID, department, course, grade) :dep, USING 103;

•- Обновим число студентов анонимный блок PL/SQL.

v_PLSQLBlock := UPDATE classes SET = + WHERE department = :d and course = :c;

END;

EXECUTE IMMEDIATE v_PLSQLBlock USING 103;

END LOOP;

END;

Выполнение запросов Запросы выполняются с помощью оператора OPEN FOR аналогично кур сорным переменным. Различие состоит в том, что содержащая за прос, может быть переменной PL/SQL, а не литералом. К получаемой курсорной переменной можно обращаться так же, как и к любой другой переменной. Для связывания используется предложение USING, так же как в операторе EXECUTE IMMEDIATE. Рассмотрим пример:

-- Этот пример содержится в файле CREATE OR REPLACE PACKAGE AS TYPE IS REF CURSOR;

- Извлекаем из таблицы students, используя предоставленное предложение WHERE, - и возвращаем открытую курсорную переменную.

FUNCTION VARCHAR2) RETURN - Извлекаем данные из таблицы students на основе предоставленной - профилирующей дисциплины и возвращаем открытую курсорную переменную.

FUNCTION StudentsQuery2(p_Major IN VARCHAR2) RETURN END NativeDynamic;

CREATE OR REPLACE PACKAGE BODY NativeDynamic AS - Извлекаем из таблицы students с помощью предоставленного предложения WHERE - и открытую курсорную переменную.

FUNCTION IN VARCHAR2) 454 ГЛАВА RETURN IS VARCHAR2(500);

BEGIN - Создаем запрос с помощью предоставленного предложения WHERE.

:= * FROM students ' - Откроем курсорную переменную и ее, OPEN FOR RETURN END - Извлекаем из таблицы students на основе предоставленной профилирующей - дисциплины и возвращаем открытую курсорную переменную.

FUNCTION IN VARCHAR2) RETURN t_RefCur IS t_RefCur;

BEGIN := * FROM students WHERE major = - Откроем курсорную переменную и вернем ее.

OPEN FOR p_Major;

RETURN END END NativeDynamic;

Мы вызываем модуль NativeDynamic следующим образом:

— Этот пример содержится в файле SQL> DECLARE 4 BEGIN 5 - Вызываем чтобы открыть курсор 6 -- для студентов с четными ID 8 MOD(id, 2) = 10 - Выполняем цикл по открытому курсору и печатаем результаты 11 even IDs: ');

12 LOOP 13 FETCH v_StudentCur INTO v_Student;

14 WHEN v_StudentCur%NOTFOUND;

15 | | ':

18 END LOOP;

19 CLOSE v_StudentCur;

21 •- Вызываем StudentsQuery2, чтобы открыть курсор для специализации по музыке Дополнительные возможности 25 - Выполняем цикл по открытому курсору и печатаем результаты 27 following students are music 28 LOOP 29 FETCH INTO 30 EXIT WHEN 31 ' 32 ' II 34 END LOOP;

35 CLOSE 36 END;

37 / The following students have even IDs:

Scott Smith Joanne Junebug 10004: Patrick Poll 10006: Barbara Blues 10008: Ester Elegant 10010: Rita The following students are music majors:

10007: David Dinsmore 10009: Rose Riznit PL/SQL procedure successfully Выполнение запросов с помощью EXECUTE IMMEDIATE IM MEDIATE можно также использовать для однострочных запросов, с при менением или без применения переменных привязки. В случае массовых связываний (см. ниже) его можно использовать и для многострочных за просов. Требование состоит в том, чтобы все строки извлекались в одной операции. Приведем пример:

Это пример содержится в файле SQL> DECLARE 2 VARCHAR2(200);

3 v_Class 4 v_Description 5 BEGIN 6 - Сначала извлекаем в переменную 8 description ' 9 ' FROM classes ' 10 WHERE department = || 11 course = 13 EXECUTE IMMEDIATE 14 INTO v_Description;

456 ГЛАВА 18 - Теперь помещаем данные в запись, используя переменную привязки 19 := 20 * 21 ' FROM classes ' 22 ' WHERE description = 23 EXECUTE IMMEDIATE 24 INTO v_Class 25 USING 28 ' || || ' ' || 30 - Извлекается более одной строки, что приводит в ошибке ORA-1422.

31 := FROM 32 EXECUTE v_SQLQuery 33 INTO v_Class;

34 END;

35 / Fetched Economics Fetched ECN DECLARE * ERROR at line exact fetch returns more than requested number of rows at line Ошибка ORA-1422 возникает потому, что запрос возвращает более одной строки.

Массовые соединения Операторы SQL в блоках PL/SQL пересылаются системе поддержки которая в свою очередь может передавать данные назад системе поддержки PL/SQL (как результат Во многих случаях данные, которые вносятся или обновляются в базе данных, помещаются сначала в сборную конструкцию PL/SQL, и затем эта сборная конструкция про сматривается с помощью цикла FOR для отправки информации системе поддержки SQL. Это приводит к переключению контекста между PL/SQL и SQL для каждой строки в сборной конструкции.

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

Г] Этот пример в файле DECLARE TYPE t_Numbers IS TABLE OF Дополнительные возможности TYPE t_Strings IS TABLE OF := t_Strings := t_Strings(1);

- Печатаем общее число строк таблицы PROCEDURE IN VARCHAR2) IS NUMBER:

BEGIN INTO FROM || Count is || END PrintTotalRows;

BEGIN - Сначала удаляем из temp_table.

DELETE -- Заполняем вложенные таблицы PL/SQL, используя 1000 значений.

FOR v_Count IN LOOP := || END LOOP;

-- Внесем в базу данных все 1000 элементов с помощью одного оператора FORALL.

FORALL IN INSERT INTO VALUES - Теперь должно быть 1000 строк.

first — Снова внесем в базу данных элементы с 501 по 1000.

FORALL IN INSERT INTO VALUES - Теперь у нас должно быть строк.

second — Обновим все строки.

FORALL v_Count IN UPDATE SET char_col = WHERE = - Несмотря на то, что имеется только 1000 элементов, этот оператор - обновляет 1500 строк, так как предложение WHERE соответствует - 2 для каждой из последних 500 строк.

processed || 458 ГЛАВА — Аналогично, этот DELETE удалит 300 строк.

FORALL IN DELETE FROM WHERE = - Поэтому должно остаться 1200 строк.

END;

. Результатом выполнения приведенного выше блока будет следующее:

After first insert: Count is After second insert: Count is Update processed 1500 rows.

After delete: Count is Как показывает этот пример, FORALL синтаксически аналогичен цик лу FOR. Он может использоваться для сборных конструкций любого типа и для операторов INSERT, DELETE и UPDATE. Определяемый в FORALL диапазон должен быть и все элементы в этом диапазоне должны существовать.

Особенности использования транзакций Если в массовой операции DML при обработке одной из строк возникает ошибка, то откатывается только эта строка. Предыдущие строки будут об работаны. Это аналогично поведению массовых операций в OCI и дейст вию Рассмотрим пример:

••- Этот пример содержится в SQL> DECLARE 2 TYPE IS TABLE OF 3 INDEX BY BINARY_INTEGER;

4 TYPE t_Numbers IS TABLE OF 5 INDEX BY BINARY_INTEGER;

6 v_Strings t_Strings;

8 BEGIN 9 - Удаляем из таблицы и задаем индексную таблицу.

10 DELETE FROM 11 FOR v_Count IN 1..10 LOOP 12 := 13 := v_Count;

14 END LOOP;

16 FORALL IN 1.. 17 INSERT INTO tempjtable char_col) 18 VALUES 20 -- Добавим дополнительный в 21 v_Strings(6) := | Дополнительные возможности 23 •- Это массовое обновление не будет выполнено в шестой строке, но первые 24 - 5 строк будут обновлены.

25 FORALL v_Count IN 26 UPDATE 27 SET char_col = char_col v_Strings(v_Count) 28 WHERE = 29 EXCEPTION 30 WHEN OTHERS THEN 31 exception:

32 COMMIT;

34 / Got exception: inserted value too large for column PL/SQL procedure successfully completed.

SQL> -- Этот запрос должен показать, что первые 5 строка SQL> -- были изменены.

SQL> SELECT 2 FROM 3 ORDER BY CHAR_COL 10 row selected В можно указать в операторе FORALL новую конструкцию SAVE EXCEPTIONS. При этом любая ошибка, возникшая во время па кетной обработки, будет сохранена, а обработка будет продолжена. Для просмотра исключений можно использовать новый атрибут который действует как таблица PL/SQL.

Это показывает следующий сеанс — Этот пример содержится в файле FORALL.

SQL> DECLARE 2 TYPE IS TABLE OF char_col%TYPE 3 INDEX BY BINARY_INTEGER;

4 TYPE IS TABLE OF 5 INDEX BY BINARY_INTEGER;

6 t_Strings;

8 NUMBER;

460 ГЛАВА 9 BEGIN 10 - Удаляем из таблицы и задаем индексную таблицу.

11 DELETE FROM 12 FOR IN 1..10 LOOP 13 := 14 := 15 END LOOP;

17 FORALL v_Count IN 18 INSERT INTO 19 VALUES 21 •- Добавляем дополнительный t_Strings(6).

22 v_Strings(6) := v_Strings(6) 24 - Это массовое обновление не будет выполнено в шестой строке, но 25 - обработка 26 FORALL IN SAVE EXCEPTIONS 27 UPDATE 28 SET char_col = v_Strings(v_count) 29 WHERE = 30 EXCEPTION 31 WHEN OTHERS THEN 32 exception: || SQLERRM);

33 -- Печатаем все ошибки.

34 := 36 ' Number of errors during ' || v_NumErrors);

37 FOR IN LOOP 38 || v_Count ||, iteration || 39 || 40 41 END LOOP;

43 COMMIT;

44 END;

45 / Got exception: error(s) in array Number of errors during processing: Error iteration 6 is: inserted value too large for column PL/SQL procedure successfully completed.

SQL> -- Этот запрос должен показать, что строки 1 - 5 и 7 - SQL> -- изменяются, несмотря на то, что строка 6 вызывает ошибку.

SQL> SELECT char_col 2 FROM 3 ORDER BY CHAR_COL Дополнительные возможности 10 row selected.

Предложение BULK COLLECT Оператор применяется для операторов DML. Эквивалентным предложением для массового извлечения является BULK COLLECT. Оно используется как часть предложения SELECT INTO, FETCH INTO или RETURNING INTO. BULK COLLECT извлекает из запроса строки в указан ную сборную конструкцию, как показано в следующем примере:

Г] — Этот пример содержится в файле BULK_COLLECT.

DECLARE TYPE IS TABLE OF TYPE t_Strings IS TABLE OF char_col%TYPE;

:= v_String t_Strings := t_Strings(1);

v_Strings2 t_Strings;

CURSOR IS SELECT char_col FROM WHERE > ORDER BY BEGIN - Сначала загружаем с 1500 строками, 500 из которых - являются дубликатами.

v_Strings.EXTEND(1500);

FOR v_Count IN LOOP := := || v_Count;

IF > 500 THEN + 500) := + 500) := || END IF;

END LOOP;

DELETE FROM FORALL v_Count IN INSERT INTO VALUES 462 ГЛАВА - Помещаем все строки во вложенные таблицы с помощью одной операции.

SELECT BULK COLLECT INTO v_Strings FROM tempjtable ORDER BY query fetched ' || || ' rows');

- Таблицу не требуется инициализировать, - BULK COLLECT добавит элементы должным образом.

SELECT BULK COLLECT INTO v_Numbers FROM tempjtable;

query fetched ' COUNT ' - Мы можем также произвести массовое извлечение из курсора.

OPEN FETCH c_char BULK COLLECT INTO v_Strings2;

CLOSE fetch retrieved ' || || ' rows');

Результатом выполнения приведенного выше блока будет следующее:

First query fetched 1500 rows Second query fetched 1500 rows Cursor fetch retrieved 400 rows PL/SQL procedure successfully completed.

Оператор BULK COLLECT может использоваться как для неявных курсоров (SELECT INTO), так и для явных курсоров (FETCH INTO). Он будет извлекать данные, начиная с индекса 1, и перезаписывать элементы в выходной сборной конструкции до тех пор, пока не будут извлечены все запрошенные строки.

BULK COLLECT и RETURNING INTO Конструкция BULK COLLECT жет использоваться также как часть предложения RETURNING INTO для получения информации из оператора DML, как показано в следующем примере:

Г) Этот пример содержится в файле BULK_COLLECT.

SQL> DECLARE 2 TYPE IS TABLE OF 3 INDEX BY BINARY_INTEGER;

4 TYPE t_Strings IS TABLE OF 5 INDEX BY BINARY_INTEGER:

6 v_Numbers 7 v_Strings t_Strings;

Дополнительные возможности 8 BEGIN 9 - Удаляем из таблицы, а затем вставляем 55 строк. Устанавливаем 10 11 DELETE FROM 12 FOR v_0uter IN 1..10 LOOP 13 FOR IN 1. LOOP 14 INSERT INTO char_col) 15 VALUES | | 16 END LOOP;

17 := 18 END LOOP;

20 - Удаляем некоторые строки, но сохраняем символьные данные.

21 FORALL v_Count IN 22 DELETE FROM temp_table 23 WHERE = 24 RETURNING char_col BULK COLLECT INTO v_Strings;

26 - v_Strings содержит теперь 15 строк, что представляет собой 1+2+3+4+5.

28 FOR v_Count IN. LOOP 29 PUT_LINE( 30 | v_Count ') = ' 31 END LOOP;

32 END;

33 / After delete:

v_Strings(1) = Element # v_Strings(2) = Element # v_Strings(3) = Element # v_Strings(4) = Element # v_Strings(5) = Element # v_Strings(6) = Element # v_Strings(7) = Element # v_Strings(8) = Element # v_Strings(9) = Element # v_Strings(10) = Element = Element # v_Strings(12) = Element # v_Strlngs(13) = Element # v_Strings(14) = Element # v_Strings(15) = Element # PL/SQL procedure successfully completed.

Объектные типы Одним из основных усовершенствований PL/SQL в являются объектные типы. расширяет реляционную модель и бо лее ранних версий. Объектный тип содержит атрибуты и методы. На пример, рассмотрим тип Point, который создается следующим образом:

464 ГЛАВА г] — Этот пример содержится в файле CREATE OR REPLACE TYPE Point AS OBJECT ( - Точка определяется своими координатами в декартовой системе координат.

х NUMBER;

у NUMBER;

- Возвращает строку символов MEMBER FUNCTION ToString RETURN VARCHAR2, PRAGMA RESTRICT_REFERENCES(ToString, RNDS, RNPS, - Возвращает расстояние между р и текущей Point (SELF).

- Если р не определена, то по умолчанию используется (О, MEMBER FUNCTION Distance(p IN Point DEFAULT Point(0, RETURN NUMBER PRAGMA WNDS, RNPS, WNPS), - Возвращает сумму р и текущей Point.

MEMBER FUNCTION IN Point) RETURN Point;

PRAGMA RNDS, WNDS, RNPS, WNPS), - Возвращает текущую Point * n MEMBER FUNCTION IN NUMBER) RETURN Point, PRAGMA RNDS, WNDS, RNPS, WNPS) CREATE OR REPLACE TYPE BODY Point AS - Возвращаем строку MEMBER FUNCTION ToString RETURN VARCHAR2 IS v_Result v_xString VARCHAR2(8) := SUBSTR(TO_CHAR(x), 1, 8);

v_yString VARCHAR2(8) := SUBSTR(TO_CHAR(y), 1, 8);

BEGIN v_Result := '(' x_vString ', ';

RETURN END ToString;

- Возвращаем расстояние между р и текущей Point (SELF).

- Если р не определено, то по умолчанию используется (О, О).

MEMBER FUNCTION Distance(p IN Point DEFAULT Point RETURN NUMBER IS BEGIN RETURN - 2) + POWER(y END Distance;

- Возвращаем сумму р и текущей Point.

MEMBER FUNCTION IN Point) RETURN Point IS Point;

BEGIN v_Result := Point(x + p.x, у + p.y);

RETURN END Plus;

Дополнительные возможности - Возвращаем текущую Point * п.

MEMBER FUNCTION IN NUMBER) RETURN Point IS Point;

BEGIN Point(x * n, у * n);

RETURN END Times;

END;

Тип моделирует точку в декартовой системе координат. Как вид но из приведенного примера:

• Объектные типы похожи синтаксисом на модули тем, что они также имеют заголовок и тело. Как и в случае модулей, тело зависит от за головка.

• Атрибуты, например х и у в примере выше, объявляются аналогич но переменным PL/SQL. Такие методы, как ToString, Plus и Times, объявляются аналогично подпрограммам PL/SQL, отличи ем является лишь указание ключевого слова MEMBER.

• Как и в записях PL/SQL, к атрибутам объектов можно обращаться при помощи нотации с точкой.

После определения типа можно объявлять объекты этого типа и вы зывать их методы, как показывает следующий сеанс — Этот пример содержится в файле DECLARE 2 v_Point1 Point := Point(1, 2);

4 v_Point3 Point;

5 BEGIN 6 v_Point2 := 7 v_Point3 := v_Point1.Plus(v_Point2);

8 2:

9 3: | 10 between and point 1: ' || 12 Distance between point 1 and point 2: || 14 END;

15 / Point 2: (4, 8) Point 3: (5, 10) Distance between origin and point Distance between point 1 и point 2:

PL/SQL procedure successfully completed.

466 ГЛАВА Этот блок показывает, что объекты инициализируются конструктором, который получает все атрибуты в качестве аргументов. Конструктор неяв но создается как часть объектного типа.

Хранение объектов в базе данных Можно хранить объекты в таблицах базы данных и для их обработки ис пользовать SQL. Таблица может хранить объекты как столбцы, либо таб лица может быть объектной, и в этом случае каждая строка представляет экземпляр объекта. Два типа таблиц, а также несколько примеров опера торов SQL показаны ниже:

••- Этот пример содержится в файле SQL> CREATE TABLE OF Point;

Table created.

SQL> CREATE TABLE ( 2 key VARCHAR2(20), 3 value Point);

Table created.

SQL> DECLARE 2 Point ;

= Point(1, 1);

3 Point;

5 NUMBER;

6 NUMBER;

7 BEGIN 8 - Внесем данные в обе таблицы.

9 INSERT INTO VALUES 10 INSERT INTO VALUES v_Point);

12 - При запросе объектной таблицы мы получим каждую строку в виде набора 13 - элементов списка выбора, как если бы это была реляционная таблица.

14 SELECT * 15 INTO 16 FROM point_object_tab;

17 query of object table: ' || 18 v_XCoord v_YCoord);

20 - Но если использовать оператор VALUE, мы получим каждую строку 21 - в виде объекта.

22 SELECT VALUE(ot) 23 INTO 24 FROM ot;

25 table;

' | | - Выборка из объектного столбца всегда возвращает 28 - экземпляр объекта.

29 SELECT key, 30 INTO 31 FROM Дополнительные возможности 32 v_NewPoint.ToString);

34 END;

35 / Relational query of object table: 1, object table:

PL/SQL procedure successfully completed.

Таким образом, чтобы запросить строку объектной таблицы и полу чить результат в виде объекта (а не отдельного столбца), необходимо использовать оператор VALUE.

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

Объектная ссылка является указателем на объект, а не самим объектом.

Объектные ссылки могут извлекаться с помощью оператора REF в запро се или с помощью предложения REF INTO оператора INSERT. Приведем пример:

- Этот пример содержится в файле PointSQL.sql SQL> DECLARE 2 v_PointRef REF Point;

3 v_Point Point;

4 BEGIN 5 DELETE FROM 7 - Внесем несколько точек в таблицу.

8 INSERT INTO point_object_tab (x, у) 9 VALUES (О, О);

10 INSERT INTO point_object_tab (x, у) 11 VALUES (1, 13 - Получим ссылку на вторую строку.

14 SELECT REF (ot) 15 INTO v_PointRef 16 FROM point_object_tab ot 17 WHERE x = 1 AND у = 1;

19 - Разыменуем ее, чтобы получить реальную точку.

20 SELECT DEREF 21 INTO 22 FROM dual;

23 reference ' || 26 - Можно также получить ссылку на вновь внесенную строку 27 - с помощью REF INTO.

28 INSERT INTO point_object_tab ot (x, y) 29 VALUES(10, 10) 30 RETURNING REF (ot) INTO v_PointRef;

468 ГЛАВА 31 END;

32 / Selected reference PL/SQL procedure successfully completed.

Большие объекты объект (LOB, large object) — это поле базы данных, которое содер жит большой объем данных, таких как графический файл или длинный текстовый документ. Какой из типов данных Oracle лучше всего подходит для хранения информации такого вида? В столбец способен хранить до 2000 байтов. Помимо ограничения на максималь ный размер, столбец может содержать только символьные данные, но не двоичные. Столбец LONG может содержать до 2 Гбайт и хранить символьные данные, a LONG RAW — двоичные данные. LONG и LONG RAW были в наиболее подходящими доступными типами данных для хранения информации LOB. Однако столбцы LONG и LONG RAW имеют много ограничений, включая и то, что в таблице базы дан ных может быть только один столбец LONG или LONG RAW. Кроме того, единственным интерфейсом для манипуляции данными LONG и LONG RAW по частям является интерфейс Oracle Call, а извлечение по частям данных LONG осуществляется с помощью модуля Ра бота с LONG или LONG DATA через другие интерфейсы требует, чтобы весь столбец содержался в одной переменной. В связи с этим и другими ограничениями ни один из типов данных не предоставлял удов летворительного решения для хранения LOB.

В и выше доступны столбцы LONG и LONG RAW (с теми же ограничениями), а тип данных может содержать 4000 сим волов. И все же эти типы данных не удобны для хранения больших объ ектов. Чтобы делать это эффективно, вводит новое семейство данных — семейство Существуют четыре различных вида LOB, ко торые созданы для различных видов данных: CLOB, NCLOB, BLOB и BFILE (см. таблицу Таблица Типы Тип LOB Описание CLOB Аналогично типу LONG в тип CLOB может хранить символьные данные, определенные в наборе символов базы данных.

NCLOB NCLOB хранит многобайтовые данные в национальном наборе символов фиксированной длины. В NCLOB может хранить многобайтовые данные переменной длины.

BLOB Аналогично типу LONG RAW в BLOB может содержать двоичные данные, которые не интерпретируются базой данных.

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

Дополнительные возможности Данные хранятся в базе данных, поэтому CLOB, NCLOB и BLOB в со вокупности называются внутренними LOB. BFILE хранят данные вне базы данных и называются внешними LOB. LOB имеют следующие характеристики:

• Максимальный размер равен 4 Гбайт (LONG и LONG RAW в и ограничены 2 Гбайт).

• LOB можно обрабатывать с помощью различных интерфейсов, вклю чая и модуль в PL/SQL. Все интерфейсы LOB предоставляют произвольный доступ к LOB для чтения и записи (за исключением BFILE, который предназначен только для чтения).

• Многие ограничения на данные LONG и LONG RAW не действуют для LOB. Например, может существовать неограниченное число столбцов LOB (до максимального числа столбцов) в заданной таблице базы данных.

• Объекты могут иметь атрибуты LOB, и методы могут получать LOB в качестве аргументов. Однако объект не может иметь атрибут NCLOB, хотя метод может получать аргумент NCLOB.

• LOB могут использоваться как переменные привязки.

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

Манипулирование данными LOB В отличие от столбцов LONG и LONG RAW, данные в LOB обычно недо ступны непосредственно. Столбец LOB в таблице базы данных хранит ло катор, который указывает на реальные данные LOB.

Существует ряд интерфейсов для манипуляции данными LOB. Это мо дуль DBMS_LOB, интерфейсы Oracle Call, и Pro*COBOL, Oracle Objects для OLE и Данные LOB можно также обрабатывать с помощью SQL, как показано в следующем примере (при мер использования модуля DBMS_LOB приводится ниже в разделе "До полнительные Г) Этот пример содержится в файле CREATE TABLE ( 2 key NUMBER PRIMARY KEY, 3 clob_lob CLOB, 4 blob_col BLOB, 5 BFILE, 6 );

Table created.

-- Следующие два оператора INSERT добавляют две строки к таблице.

SQL> INSERT INTO lobdemo (key, clob_lob, bfile_col) 2 VALUES (50, is a character 4 NULL);

1 row 470 ГЛАВА INSERT INTO lobdemo (key, clob_col, blob_col, bfile_col) 2 VALUES (51, is another character 4 NULL);

1 row SQL> -- Можно также применить INSERT к результатам запроса.

SQL> -- Следующий код будет копировать строки 50 и 51 в 60 и 61.

SOL> INSERT INTO lobdemo 2 SELECT key + 10, clob_col, blob_col, NULL 3 FROM lobdemo 4 WHERE key IN (50, 51);

2 rows SQL> -- Этот оператор присвоит blob_col новое значение.

SQL> UPDATE lobdemo 2 SET blob_col = 3 WHERE key IN (60, 61);

2 rows updated.

SQL> -- И наконец, можно удалить строку SQL> DELETE FROM lobdemo 2 WHERE key = 1 row Этот пример показывает, что данные LOB могут обрабатываться, как если бы они были столбцом или RAW, причем размер данных не должен превышать 4000 байтов (максимальная длина столбца В случае большей длины необходимо использовать другие интерфейсы.

Канализированные табличные функции Для выдачи нескольких столбцов данных функция PL/SQL должна воз вращать либо CURSOR, либо сборную конструкцию данных. REF CURSOR работает с данными, которые могут быть выбраны в запросе.

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

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

Г) — Этот пример содержится в файле CREATE TYPE MyType AS OBJECT ( NUMBER, Дополнительные возможности field CREATE TYPE MyTypeList AS TABLE OF CREATE OR REPLACE FUNCTION RETURN MyTypeList PIPELINED AS MyType;

BEGIN FOR IN LOOP := ' | PIPE END LOOP;

RETURN;

END Канализированная табличная функция должна возвращать сборную конструкцию. Внутри функции используется оператор PIPE ROW для воз врата отдельных элементов сборной конструкции. Функция должна завер шаться пустым оператором RETURN. После создания функции ее можно вызвать в запросе SQL с помощью оператора TABLE:

Этот пример содержится в файле SQL> SELECT * 2 FROM TABLE FIELD Row 2 Row 3 Row 4 Row 5 Row 6 Row 7 Row 8 Row 9 Row 10 Row 11 Row 12 Row 13 Row 14 Row Row 16 Row 17 Row 18 Row 19 Row 20 Row 20 rows selected.

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

472 ГЛАВА Дополнительные модули PL/SQL имеет целый ряд встроенных модулей, обеспечивающих допол нительные возможности, такие как коммуникационные протоколы и до ступ к файловой системе. В приложении А перечисляются модули, поставляемые с базой данных. Кратко рассмотрим некоторые из основных модулей.

DBMS_SQL используется для выполнения динамического SQL в PL/SQL.

Он не встроен непосредственно в язык и поэтому менее эффективен, чем встроенный динамический SQL (который доступен в и выше).

Модуль DBMS_SQL позволяет непосредственно управлять обработкой операторов в курсоре, выполнять синтаксический разбор оператора, свя зывать входные переменные и определять выходные переменные. Следую щий пример показывает некоторые применения модуля DBMS_SQL.

Этот пример в файле CREATE OR REPLACE PROCEDURE /* Использует DBMS_SQL для обновления таблицы учебных групп, задания числа зачетов для всех групп на указанном факультете.

*/ IN p_NewCredits IN classes.

OUT INTEGER) AS v_CursorID INTEGER;

BEGIN - Откроем курсор для обработки.

:= - Определим строку SQL.

:= classes SET = WHERE department = - Выполним синтаксический разбор оператора.

- Свяжем с позицией :пс. Эта перегруженная версия - BIND_VARIABLE привяжет как NUMBER, - поскольку он так объявлен.

- Свяжем с позицией :dept. Эта перегруженная версия - BIND_VARIABLE привяжет как CHAR, поскольку он так - Выполним оператор Дополнительные возможности := - Закроем курсор EXCEPTION WHEN OTHERS THEN — Закроем курсор и снова инициируем ошибку.

RAISE;

END UpdateClasses;

DBMS_PIPE DBMS_PIPE позволяет посылать сообщения между сеансами, подключен ными к одной базе данных. Сеансы могут быть различными клиентскими программами, либо они могут выполняться на различных машинах. Если они способны посылать команды PL/SQL на сервер, то они могут обща ться. Например, можно использовать для коммуникации между хранимой процедурой и программой Рго*С. Этим обеспечивается функциональность, аналогичная внешней процедуре.

Каналы (pipe) являются асинхронными — они действуют независимо от транзакций. Не существует способа отменить сообщение, посланное в ка нал, даже если сеанс, который его послал, выполнил ROLLBACK. Следо вательно, каналы могут использоваться для выполнения автономных транзакций.

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

— Этот пример содержится в файле DECLARE VARCHAR2(30) := INTEGER;

BEGIN - Упаковываем некоторую информацию в канал. Мы пошлем текущую дату, — число и значение varchar2.

is a message sent from the -- Теперь можно послать сообщение.

:= IF ! = 0 THEN || || sending END IF;

END;

474 ГЛАВА Этот код посылает сообщение, содержащее дату, число и строку, в ка нал Можно получить это сообщение в другом (или в том же самом) сеансе соединенном с той же базой данных, с помощью следую щего кода:

пример содержится в файле DECLARE VARCHAR2(30) := INTEGER;

v_DateVal DATE;

NUMBER;

BEGIN - Сначала получаем сообщение. Этот вызов блокируется до тех пор, -- пока не будет послано сообщение.

v_Status If 0 THEN receiving END IF;

- Теперь можно распаковать части сообщения. Это делается - в том же порядке, в котором они были посланы.

- Распечатаем их.

' | v_DateVal);

|| || v_StringVal);

END;

может применяться для отправки сообщений, содержащих данные NUMBER, DATE, RAW или Определенные пользователем объектные типы и сборные конструкции не поддерживают ся DBMS_PIPE. Для отправки сообщений с данными этих типов можно использовать Oracle Advanced Queuing.

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

• Сигналы (alert) являются синхронными. Сигнал не посылается, пока записывающий сеанс не выполнит COMMIT. Если он откатывается, сигнал не передается.

• Посланное в канал сообщение будет получено только одним прием ником. Если в канале существует несколько приемников, только один из них примет сообщение. Сигналы, однако, могут быть по лучены несколькими приемниками одновременно.

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

• Если в канал посылаются два сообщения, приемник получит оба.

Однако если посылаются два сигнала, будет получен только второй сигнал.

Следующий блок демонстрирует отправку сигнала с помощью процедуры ••- Этот пример содержится в файле DECLARE VARCHAR2(30) := BEGIN •- Сигнал посылается процедурой SIGNAL.

Alert!

- Он не будет передан, пока не выполнится COMMIT.

COMMIT;

END;

Сигналы считываются процедурами или Следую щий блок демонстрирует использование WAITONE:

-- Этот пример содержится в файле DECLARE VARCHAR2(30) INTEGER;

BEGIN - Чтобы получить сигнал, необходимо сначала - После регистрации можно ожидать получения.

v_Status);

IF = 0 THEN ELSE timed END IF;

END;

UTL_FILE PL/SQL не имеет никаких встроенных возможностей взаимодействия с файловой системой вне базы данных;

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

476 ГЛАВА UTL_FILE обращается к используя каталог и имя файла. При этом каталог должен быть доступен базе данных. Для реализации этого существуют два уровня безопасности:

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

• Каталог должен быть задан параметром в UTL_FILE_DIR может содержать список каталогов или звездочку которая означает, что разрешается использовать все каталоги.

При удовлетворении этих требований можно получить доступ к фай лам в указанном каталоге. Приведем пример:

••- Этот пример содержится в файле DECLARE BEGIN - Откроем файл для записи. Если файл не существует, он будет создан. Если файл - существует, он будет перезаписан.

:= - Запишем несколько строк в файл.

is line FOR v_Counter IN LOOP is line END LOOP;

- Закроем файл.

UTL_FILE.

END;

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

This is line This line 2!

This is line 3!

This is line 4!

This is line 5!

This is line 6!

This is line 7!

This is line 8!

This is line 9!

This is line 10!

This is line 11!

Модуль может также использоваться для чтения текстовых файлов. Отметим, что двоичные файлы недоступны UTL_FILE — поддер живаются только текстовые файлы.

Дополнительные возможности Аналогично UTL_FILE, обеспечивает в PL/SQL возможность коммуникации вне базы данных. позволяет открыть сокет с удаленным хостом, чтобы выполнить чтение и запись с помощью прото кола TCP. В следующем примере используется для получения одиночного запроса HTTP с хоста:

Этот пример содержится в файле DECLARE v_Connection PLS_INTEGER;

BEGIN - Открываем соединение на порту 80, который является стандартным портом HTTP.

:= 80);

- Посылаем запрос HTTP, := - Распечатаем полученные первые 10 строк.

BEGIN FOR IN 1.. 10 LOOP END LOOP;

EXCEPTION WHEN NULL;

END;

END;

Модуль может применяться для реализации любого протоко ла, который строится поверх TCP. Фактически и делают именно это, внутренне используя UTL_TCP.

написан поверх UTL_TCP и реализует протокол SMTP, ис пользуемый для пересылки e-mail. Он позволяет общаться с сервером SMTP вне базы данных. Приведем пример:

г] -- Этот пример содержится в файле VARCHAR2(50) := VARCHAR2(50) := •- Адрес сервера SMTP. В системах Unix обычно работает VARCHAR2(50) := ;

v MailConnection BEGIN - Посылаемое сообщение. Поля сообщения (from, subject и •- должны быть разделены символом возврата каретки, -- в систем это v_Message := CHR(10) || Hello from || CHR(10) || message sent to you courtesy of the - Откроем соединение с сервером.

:= - Используя сообщения SMTP, посылаем e-mail.

v_ToAddr);

- Закроем соединение.

END;

UTL_SMTP создан для пересылки e-mail через существующий сервер SMTP;

он не предназначен для создания самого сервера SMTP.

UTL_HTTP UTLJHTTP реализует протокол HTTP и позволяет программам PL/SQL действовать в качестве клиента в коммуникациях с сервером HTTP (ана логично браузеру появился в (предоставлялись базовые службы). Он извлекал результаты одиночного запроса HTTP в виде одного фрагмента (с помощью либо в виде более мелких фрагментов (с помощью J?IECES).

Приведем пример:

Г] Этот пример содержится в файле CREATE TABLE ( sequence_no NUMBER PRIMARY KEY, piece DECLARE v_Result VARCHAR2(100) := v_Proxy := BEGIN - Этот вызов демонстрирует функциональность UTL_HTTP - в версии 8.0.6. Он будет извлекать до 10 фрагментов ответа, - каждый из которых содержит до 2000 символов.

v_Result 10, v_Proxy);

FOR v_Count IN LOOP INSERT INTO http_results VALUES (v_Count, END LOOP;

возможности END;

расширяет UTL_HTTP для поддержки протокола HTTPS.

содержит полностью переписанный модуль который под держивает HTTPS, cookies, перенаправления, устойчивые соединения и доступ к сайтам Web.

предоставляет функцию которая ищет IP-адрес хоста на основе его имени. Функция GET_HOST_NAME будет возвращать имя локального хоста.

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

•- Этот пример в файле DECLARE VARCHAR2(100) := BEGIN of ' | ' is ' of local host is ' END;

DBMS_JOB Модуль позволяет запланировать автоматическое выполне ние блока PL/SQL в указанное время, аналогично Блок будет выполняться одним из фоновых процессов Oracle. Чтобы реа лизовать это, необходимо задать два параметра in о • определяет число запускаемых фоновых процессов. Если он равен 0 или не установлен, фоновых процессов для заданий не будет и они не будут выполняться.

• определяет количество времени в секун дах, которое каждый процесс будет ожидать, прежде чем проверить наличие нового задания. Задание нельзя выполнить более одного раза в течение Предположим, что создана следующая процедура •- Этот пример содержится в файле л CREATE SEQUENCE START WITH INCREMENT BY CREATE OR REPLACE PROCEDURE Templnsert AS BEGIN INSERT INTO VALUES TO_CHAR(SYSDATE, 'DD-MON-YYYY HH24:

COMMIT;

END Templnsert;

Мы можем запускать Templnsert на выполнение каждые 90 секунд с по мощью следующего сценария — Этот пример в файле SQL> VARIABLE NUMBER SQL> BEGIN 2 SYSDATE, 4 COMMIT;

5 END;

6 / PL/SQL procedure successfully completed.

SQL> SQL> PRINT V JOBNUM Процедура SUBMIT будет отправлять задание на выполнение. Задание запускается немедленно и затем последовательно выполняется с интерва лом 90 секунд на основе выражения + кото рое указывает время следующего запуска задания.

Обратите внимание, что COMMIT вызывается в обоих блоках, опреде ляющих задания, и в самой процедуре Templnsert. В первом случае это не обходимо для запуска задания, а во втором изменения, произведенные заданием, будут автоматически откатываться по завершении задания.

В приведенном примере задание будет выполняться бесконечно, пока база данных не будет остановлена. Его можно удалить, вызвав функцию — Этот пример содержится в файле BEGIN COMMIT;

END;

Интерфейсом PL/SQL для LOB является Этот модуль слу жит для манипуляции данными, содержащимися в столбцах BLOB и DBMS_LOB позволяет сравнивать два LOB, до бавлять данные в LOB, копировать данные из одного LOB в другой, уда лять части LOB, выполнять операции INSTR или SUBSTR, читать и Дополнительные записывать данные LOB с произвольным доступом. DBMS_LOB предо ставляет также специальные процедуры для BFILE, которые позволяют открывать, закрывать и извлекать информацию о BFILE. В и выше позволяет также создавать и манипулировать времен ными LOB.

Большинство подпрограмм DBMS_LOB получают в качестве аргумен та локатор LOB. Он должен быть инициализирован и указывать на дейст вительный LOB в базе данных. Для создания нового локатора LOB можно использовать функцию или В следующем примере используются некоторые из подпрограмм — Этот пример содержится в файле /* Переставляет символы в обратном порядке в CLOB, указанном * байтов за раз. Результат в Например, * вызов * output, 4) * вернет Если p_ChunkSize * не делит ровно длину входной строки, последний отрезок * входного LOB, который станет первым отрезком выходного LOB, * будет меньше, чем p_ChunkSize. Если больше, * чем длина входного LOB, то выходной LOB будет идентичен * входному LOB.

V CREATE OR REPLACE PROCEDURE ReverseLOB ( p_InputLocator IN CLOB, p_OutputLocator IN OUT CLOB, IN NUMBER) AS v_LOBLength BINARY_INTEGER;

EXCEPTION;

-22926);

BEGIN - Сначала определяем длину входного LOB.

:= - Обрезаем выходной LOB до длины входных данных. Перехватываем и игнорируем - ошибку ORA-22926, если выходной LOB меньше v_LOBLength.

BEGIN v_LOBLength);

EXCEPTION WHEN THEN NULL;

END;

482 ГЛАВА - Задаем начальные смещения. Смещение входных данных отсчитывается - от начала, смещение выходных данных - с конца.

:= 1;

:= + - Выполняем цикл по входному и записываем каждый фрагмент в выходной LOOP - Выход из цикла осуществляется по получении всех отрезков, т.е. когда - становится больше значения EXIT WHEN > v_LOBLength;

- Если во входном LOB остается как минимум копируем - этот фрагмент. Иначе копируем только то, что осталось.

IF (v_LOBLength - + 1) > THEN := ELSE v_CurrentChunksize := v_LOBLength - v_InputOffset + 1;

END IF;

- Уменьшаем смещение выходных данных на размер текущего фрагмента.

:= v_0utput0ffset - Копируем текущий фрагмент.

p_InputLocator, - Увеличиваем смещение входных данных на размер текущего фрагмента.

:= v_InputOffset + END LOOP;

END ReverseLOB;

Следующий сеанс показывает несколько вызовов ReverseLOB:

••- Этот пример содержится в файле SQL> CREATE TABLE ( 2 key NUMBER;

3 clob_col CLOB;

4 blob_col BLOB);

Table created.

SQL> INSERT INTO lobdemo (key, 2 (1, 1 row SQL> INSERT INTO clob_col) 2 VALUES (2, 1 created.

SQL> INSERT INTO 2 VALUES (3, 1 row created.

SQL> INSERT INTO clob_col) Дополнительные возможности 2 VALUES (4, 1 row created.

SQL> INSERT INTO clob_col) 2 VALUES (5, 1 row SQL> INSERT INTO clob_col) 2 VALUES (6, 1 row SQL> Commit complete.

SELECT key, clob_col 2 FROM 3 WHERE key BETWEEN 1 AND 4 ORDER BY key;

KEY CLOB COL 6 rows selected. • SQL> DECLARE 2 v_Source CLOB;

3 v_Destination CLOB;

4 NUMBER;

5 CURSOR IS 6 SELECT key, clob_col 7 FROM lobdemo 8 WHERE key BETWEEN 2 and 9 FOR UPDATE;

10 BEGIN 11 SELECT clob_col 12 INTO 13 FROM lobdemo 14 WHERE key = 1;

16 - Выполняем цикл по строкам 2 - 6 и переставляем строку 17 - разными способами.

18 OPEN 19 LOOP 20 FETCH c_Destinations INTO v_Key, 21 EXIT WHEN c_Destinations%NOTFOUND;

23 IF = 2) THEN 24 v_Destination, 4);

25 (v_Key = 3) THEN 26 v_Destination, 2);

484 ГЛАВА 27 = 4) THEN 28 ReverseLOB(v_Source, v_Destination, 1);

29 ELSIF (v_Key = 5) THEN 30 v_Destination, 10);

31 ELSIF (v_Key 6) THEN 32 ReverseLQB(v_Source, 30);

33 IF;

34 END LOOP;

35 CLOSE 36 COMMIT;

37 END;

38 / PL/SQL procedure successfully completed.

SQL> SELECT key, clob_col 2 FROM 3 WHERE key BETWEEN 1 AND 4 ORDER BY key;

KEY CLOB COL 6 rows Итоги В этой главе был сделан обзор некоторых дополнительных возможно стей PL/SQL, которые определены в двух видах: как свойства языка и как модули. Эти средства обеспечивают большую мощность и гибкость PL/SQL и позволяют писать более мощные программы. К дополнитель ным свойствам относятся внешние подпрограммы, встроенный динами ческий SQL, массовые связывания, объектные типы и большие объекты.

Мы рассмотрели также модули DBMS_PIPE, UTL_SMTP, UTL_HTTP, JOB и DBMS_LOB.

риложения ПРИЛОЖЕНИЕ А Руководство по работе со встроенными модулями 488 ПРИЛОЖЕНИЕ А этом приложении описываются встроенные модули, доступные для В использования в PL/SQL.

Описание модулей PL/SQL предлагает целый ряд дополнительных функций, которые до ступны в поставляемых модулях. Эти модули принадлежат пользователю базы данных с именем SYS, однако для них созданы общие синонимы, по этому модули можно вызывать, не используя префикс SYS перед именем пакета. Для вызова процедур и функций этих модулей пользователь, кото рый не является SYS, должен иметь полномочие EXECUTE на конкрет ный модуль. Все модули создаются с помощью сценария находящегося обычно в каталоге Дополнитель ную информацию можно найти в оперативной документации Oracle. Мо дули создаются в виде отдельных файлов, которые размещаются там же, где и catproc. Файлы создания модулей снабжены комментариями по их использованию.

Ниже кратко описывается каждый из модулей, указывается номер вер сии, в которой модуль был введен. Дополнительную информацию об этих модулях можно найти либо в книге "Oracle г: Новые возможности про граммирования на языке (изд. либо в руководстве "По ставляемые модули Oracle".

DBMS_ALERT Версия 7. Описание Модуль применяется для обмена сообщениями между сеансами, соединенными с одной и той же базой данных. Опове щения (alerts) синхронны, т.е. они посылаются при завершении транзак ций. Оповещения отправляет процедура SIGNAL, а получают процедуры и Чтобы получить оповещение, заинтересованный сеанс должен зарегистрироваться с помощью процедуры REGISTER. Ин формацию об оповещениях можно найти в таблице словаря данных Версия 7. Описание Модуль применяется для регист рации информации (info) о конкретной программе в системной таблице v$session. С помощью этой информации можно определить, какие прило жения (applications) функционируют в данный момент и какие действия они выполняют. В частности, модуль можно использовать для считывания и модификации столбцов module, action и client_info таблицы v$session текущего сеанса.

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

DBMS_APPLICATION_INFO может применяться также (с помощью процедуры SET_SESSION_LONGOPS) для обновления таблицы v$session_ longop, используемой для указания статуса долговременных операций.

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

Версия Описание предоставляет административные функции для Он включает в себя процедуры по созданию и уничтожению оче редей и таблиц очередей и по изменению привилегий очередей.

DMBS_AQELM Версия Описание Модуль предоставляет процедуры для управле ния уведомлением AQ e-mail и HTTP. Он позволяет сконфигурировать такие данные, как почтовый хост, порт, адрес отправки e-mail и прокси HTTP.

Версия редакция Описание Этот модуль содержит процедуры для нормализации имен файлов, используемых в управляющем файле и каталоге восстановления в системах Windows NT. Он не предназначен для работы в системах UNIX и в редакциях ниже DBMS_DDL Версия 7. 490 ПРИЛОЖЕНИЕ А Описание Модуль предоставляет ряда полезных команд DDL, которые нельзя использовать в PL/SQL непо средственно. Для выполнения таких команд можно применять динамиче ский SQL, но в модуле DBMS_DDL они имеют другой синтаксис. Среди процедур в DBMS_DLL имеются ALTER_COMPILE, служащая для компи ляции пакетов, процедур и функций, и применяемая для анализа таблиц, кластеров и индексов.

DBMS_DEBUG Версия г (этот модуль присутствовал в более ранних версиях, но не поддерживался открыто до версии 8 г) Описание Модуль DBMS_DEBUG предоставляет интерфейс PL/SQL для отладчика Probe. Предназначен в первую очередь для реализации отладчи ков на сервере. При использовании DBMS_DEBUG осуществляется взаи модействие между двумя сеансами базы данных: отлаживаемым сеансом и сеансом, который управляет процессом отладки. Чтобы можно было от лаживать процедуру, она должна компилироваться с параметром DEBUG.

DBMS DEFER Версия Описание Модуль DBMS_DEFER предоставляет интерфейс для автома тического вызова процедур в других базах данных. Он позволяет иденти фицировать вызываемые процедуры в заданном множестве удаленных узлов.

DBMS_DEFER_QUERY Версия Описание Модуль используется для получения ин формации о вызовах процедур, реализуемых с помощью DBMS_DEFER.

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

DBMS_DEFER_SYS Версия Описание Модуль DBMS_DEFER_SYS используется для выполнения про цедур, поставленных в очередь DBMS_DEFER, и для задания списка узлов, которые доступны для распределенной обработки. Он предоставляет так же механизм повторного выполнения отказавшей процедуры.

Руководство по работе со встроенными модулями DBMS_DESCRIBE Версия 7. Описание В модуле содержится лишь одна процеду ра — При указании имени хранимой процедуры или функции процедура возвращает информа цию о параметрах, получаемых данной подпрограммой. Если подпрог рамма перегружается как часть модуля, возвращается информация обо всех перегружаемых вариантах.

В Oracle пакет который предоставляет информацию обо всех объектах базы данных, а не только о процедурах.

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

DBMS_FGA Версия Описание Модуль DBMS_FGA поддерживает специальные функции сис темы безопасности. Он имеет четыре процедуры: которая создает политику аудита;

которая удаляет политику;

ENABLE_POLICY и DISABLE_POLICY, которые соответственно включа ют и отключают политику.

DBMS_FLASHBACK Версия Описание Модуль используется для просмотра дан ных в некоторый более ранний момент времени. Это возможно только на уровне сеанса. Заданная ретроспектива (flashback) может определяться в терминах генератора времени или числа изменений системы Про цедура возвращает текущее SCN, а про цедуры и запускают ретроспективу для указанного момента времени. DISABLE слу жит для возврата к обычной обработке.

492 ПРИЛОЖЕНИЕ А DBMS_HS Версия Описание Модуль DBMS_HS позволяет задавать и отменять параметры средства, имена экземпляров и имена классов для служб не однородности Heterogeneous Services) Oracle. Oracle HS обеспечивает выполнение команд SQL в удаленной базе данных, отличной от Oracle, как если бы она была базой данных Oracle.

Версия Описание Модуль DBMS_HS_PASSTHROUGH предоставляет API для от правки оператора непосредственно на удаленный сервер, без интерпре тации его локальной базой данных. Он содержит процедуры для открытия курсора, связывания входных и выходных переменных, выпол нения, извлечения результатов и закрытия курсора, аналогично модулю DBMS_HS_PASSTHROUGH должен вызываться по соедине нию базы данных с удаленной, отличной от Oracle системой.

Версия Описание Модуль DBMSJOT создает таблицы для хранения результатов выполнения команды ANALYZE над таблицами, организованными по ин дексам. Он имеет две процедуры: BUILD_CHAIN_ROWS_TABLE и BUILD_EXCEPTIONS_TABLE, которые создают таблицы, используемые для хранения сцепленных строк и строк, нарушающих ограничения, со ответственно.

DBMS_JAVA Версия г Описание В модуле содержатся подпрограммы, управляю щие работой виртуальной машины Java в Oracle, которая служит для вы полнения хранимых процедур Java.

применяется для направления выходного потока в буфер, ис пользуемый DBMS_OUTPUT. Затем можно просмотреть этот буфер в DBMS_JOB Версия 7. Модуль используется для планирования выполне ния заданий PL/SQL в фоновом режиме. Задания планируются для вы полнения фоновыми процессами в определенное время. Задание (job) является блоком PL/SQL, обычно — вызовом хранимой процедуры. Если Руководство по работе со встроенными модулями задание завершается неудачно, то PL/SQL пытается повторять его вы полнение (до 16 раз) до тех пор, пока оно не будет успешным. JOB предоставляет процедуры для управления параметрами заданий и их по ведением во время выполнения.

Версия Описание Модуль DBMS_LDAP предоставляет API, который позволяет получить доступ к серверам LDAP, расположенным вне базы данных. В личие от других модулей, не устанавливается по умолчанию.

Его можно установить с помощью сценария Также могут быть созданы соединения SSL с сервером LDAP.

Версия Описание Модуль содержит единственную процедуру Она используется для извлечения команд SQL и PL/SQL из удаленного экземпляра базы данных (instance) и копирования их в локальный экземпляр. Локально они будут анализи роваться и компилироваться, но не выполняться. Это полезно, напри мер, в том случае, когда требуется обойти отказ экземпляра базы данных.

Версия Описание Модуль используется для работы с четырьмя типа ми больших объектов (LOB, Large Object): CLOB, BLOB, NCLOB и Модуль обеспечивает доступ к частям LOB для чтения или записи. К LOB можно также получить доступ посредством прекомпи ляторов, OCI JDBC.

Версия 7. Описание Модуль применяется для создания пользователь ских блокировок Управляются такие блокировки точно как и другие блокировки Oracle. Это значит, что их можно просматривать в постоянных представлениях словаря данных. Пользовательские блоки ровки используют в качестве префикса поэтому они не конфликту ют с блокировками Oracle.

494 ПРИЛОЖЕНИЕ А DBMS Версия Описание Модуль служит для заполнения представле ний базы данных, используемых утилитой Log Miner. Эта утилита анали зирует журналы повторного выполнения и отката в поисках информации аудита. В частности, информация в журнале повторного выполнения может использоваться для восстановления разрушенной базы данных с помощью определения исходных значений.

Версия Описание Захват измененных данных Oracle (Change Data Capture, CDC) используется для определения изменений в таблицах базы данных.

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

Версия Описание Захват измененных данных Oracle (Change Data Capture, CDC) используется для определения изменений в таблицах базы данных.

применяется для извлечения инфор мации, опубликованной DBMS_LOGMNR_CDC_PUBLISH.

Версия Описание Модуль DBMS_LOGMNR_D используется для создания файла словаря Log Miner. Модуль содержит единственную процедуру BUILD, ко торая может извлекать словарь либо как простой файл, либо как журналы повторного выполнения базы данных.

DBMS_METADATA Версия Описание Модуль DBMS_METADATA служит для извлечения информа ции об объектах базы данных, таких как таблицы и процедуры. По умол чанию для вывода используется XML. DBMS_METADATA предоставляет надмножество функций DBMS_MVIEW Версия Описание Модуль позволяет получать информацию о риализованных представлениях и обеспечивает их перезапись. Он может Руководство по работе со встроенными модулями использоваться для обновления отдельных материализованных представле ний, которые не являются частью той же самой группы обновления.

является синонимом для что отражает тот факт, что материализованные представления назывались раньше снимками.

DBMS_OBFUSCATION_TOOLKIT Версия Описание Модуль содержит две про цедуры: и Они шифруют и дешифруют строко вые и необработанные значения, применяя шифрование DES. По умолчанию привилегии использования этого модуля не предоставляются другим пользователям.

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

DBMS_OFFLINE_OG Версия Описание Модуль DBMS_OFFLINE_OG предоставляет интерфейс для управления автономным созданием Вместе с SNAPSHOT и модуль позволяет управлять реплицированной средой.

DBMS_OFFLINE_SNAPSHOT Версия Описание Модуль DBMS_OFFLINE_SNAPSHOT предоставляет интерфейс для управления автономным созданием материализованных представлений.

Вместе с и модуль ляет управлять реплицированной средой.

Версия Oracle г Описание Этот модуль позволяет анализировать материализованные представления и статистические данные, генерируемые Oracle Trace. Его используют для планирования размера и наилучшего применения мате риализованных представлений.

496 ПРИЛОЖЕНИЕ А DBMS_ORACLE_TRACE_AGENT Версия Описание Модуль предоставляет един ственную процедуру Она позволяет включать и отключать сборную конструкцию данных в определенном сеансе.

Версия Описание Модуль предоставляет единст венную процедуру Она позволяет включать и от ключать сборную конструкцию данных только в текущем сеансе.

DBMS_OUTLN Версия Описание Модуль содержит процедуры, которые позво ляют манипулировать хранимыми контурами. Хранимый контур (stored outline) — это данные, имеющие отношение к плану выполнения заданно го оператора SQL. В этот модуль называется и является синонимом этого модуля в г.

DBMS_OUTLN_EDIT Версия Описание является модулем прав вызывающей стороны. Он позволяет выполнять дополнительные операции над храни мыми контурами, которые недоступны в DBMS_OUTLN.

Версия 7. Описание Модуль DBMS_OUTPUT (в комбинации с или Server Manager) предоставляет ограниченные возможности вывода для PL/SQL.

Это удобно при тестировании и отладке кода PL/SQL. DBMS_OUTPUT не предназначен для написания отчетов — для этого лучше подходит утилита Oracle Reports.

DBMS_PCLXUTIL Версия i Описание Этот модуль обеспечивает параллельность создания локаль ных индексов внутри разделов. Внутренне, для создания дополнительных процессов выполнения, он использует задания базы данных.

по работе со встроенными DBMS_PIPE Версия 7. Описание Как и Модуль DBMS_PIPE дает возможность различным сеансам, соединенным с одной базой данных, взаимодейство вать друг с другом. Однако сообщения, посылаемые по программным кана лам (pipes), асинхронны. Если сообщение передано, оно будет доставлено по адресу даже в случае отката транзакции, пославшей это сообщение.

DBMS_PROFILER Версия г Описание Модуль DBMS_PROFILER реализует API для PL/SQL Profiler, используемого для исследования программного кода анализа про изводительности приложений PL/SQL. Многие инструменты разработ ки от сторонних поставщиков предоставляют графический интерфейс для DBMS_RANDOM Версия Описание В модуле содержатся процедуры для генера ции псевдослучайных чисел. Он работает быстрее генератора случайных чисел, написанного на PL/SQL, поскольку использует внутренний гене ратор случайных чисел Oracle.

Внимание В модуль не устанавливается по Он устанавливается как часть Криптографического пакета PL/SQL (Cryptographic Toolkit) при выполнении сценария Этот сценарий создает модуль который используется внутренне модулем Версия Описание Этот модуль в соединении с модулями позво ляет выявлять и устранять несогласованность реплицированных узлов.

Версия Описание Модуль DBMS_REDIFINITION позволяет оперативно реорга низовывать таблицы. Он делает это с помощью постепенно обновляемых материализованных представлений.

498 ПРИЛОЖЕНИЕ А DBMS_REFRESH Версия 7. Описание Модуль используется для создания групп ма териализованных представлений (называемых ранее группами момента льных снимков), которые могут быть обновлены вместе как группа. Он предоставляет процедуры для создания, разрушения, модификации и руч ного обновления этих групп.

DBMS_REPAIR Версия Описание Модуль используется для выявления и исправ ления некоторых видов повреждений, возникающих в блоках данных и индексов. Как правило, им пользуются не разработчики, а администраторы.

DBMS_REPCAT, DBMS_REPCAT_ADMIN, DBMS_REPCAT_INSTANTIATE,DBMS_REPCAT_RGT и Версия Описание Эти модули используются для управления симметричной реп ликацией Oracle. В следующей таблице кратко описывается каждый из этих модулей. Дополнительную информацию можно найти в документа ции Oracle.

Модуль Описание Администрирование и обновление каталога и среды репликации Создание пользователей с необходимыми полномочиями Создание экземпляров по шаблонам развертывания Создание и сопровождение шаблонов групп обновления DBMS_REPUTIL Дополнительные утилиты симметричной репликации и Версия Руководство по работе со встроенными модулями Описание Эти модули позволяют работать с планами ресурсов, группа ми потребителей и директивами планов, а также с соответствующими привилегиями.

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

DBMS_RLS Версия г Описание Модуль позволяет управлять доступом к отдельным строкам данных. С помощью можно удалять, вклю чать и отключать политики, которые управляют доступом. Он присутству ет только в производственной редакции (Enterprise Edition) и Версия Описание В тип ROWID (идентификатор строки) сложнее, чем в причем в компоненты кодируются. Модуль позволяет выполнять преобразование между форматами ROWID в и и получать информацию о компонентах ROWID.

DBMS_SESSION Версия 7. Описание Команду ALTER SESSION нельзя выполнять непосредственно в PL/SQL. Модуль DBMS_SESSION предоставляет интерфейс к некото рым вариантам ALTER SESSION, позволяя вызывать их из блоков PL/SQL. В качестве альтернативы DBMS_SESSION можно использовать динамический SQL, поскольку он обеспечивает выполнение произволь ных операторов, в том числе и ALTER SESSION.

DBMS_SHARED_POOL Версия 7. Описание Модуль используется для работы с раз деляемым пулом (shared pool). В разделяемом пуле можно закрепить 500 ПРИЛОЖЕНИЕ А модули и процедуры так, что они не будут удаляться из пула с течением времени. Настройка разделяемого пула — ключевой момент процесса оп тимизации среды PL/SQL.

и Версия Описание Модуль DBMS_SPACE позволяет анализировать рост сегментов и потребность в дисковом пространстве, а модуль служит для локального управления табличными областями.

Версия 7. Описание Модуль реализует динамический PL/SQL. С его помощью можно создавать операторы SQL и блоки PL/SQL во время вы полнения и выполнять их. Кроме можно использовать для выполнения в PL/SQL операторов DDL. г предлагает внутрен ний динамический SQL, более быстрый и простой, чем DBMS_SQL.

и STANDARD Версия 7. Описание Совместно модули и STANDARD реализуют все встроенные функции PL/SQL. В отличие от других модулей, имена входящих в них подпрограмм не нужно предварять именем модуля.

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

DBMS_TRACE Версия г Описание Модуль позволяет включать и отключать трас сировку приложений PL/SQL и определять ее уровень. Трассировка PL/SQL может содержать такую информацию, как вход или выход из процедуры, инициированные исключения и операторы SQL.

Руководство по работе со встроенными модулями Версия 7. Описание В модуле находятся управ ляющие транзакциями. Многим из них соответствуют эквивалентные SQL-команды PL/SQL. содержит процедуры для за вершения и отката транзакций и выполняет команду SET TRANSACTION.

DBMS Версия Описание Модуль позволяет изменять и удалять трансформации, которые используются при форматировании сообщений в Oracle Advanced DBMS_TTS Версия Описание Процедуры модуля DBMS_TTS используются администратора ми баз данных для определения информации о переносимых наборах.

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

DBMS_TYPES Версия Описание Модуль не содержит процедур — в нем определе ны только константы, которые представляют типы данных, доступные в базе данных. Он используется в приложениях interMedia.

Версия 7. Описание Модуль предоставляет дополнительные функ циональные возможности для управления процедурами, сообщениями об ошибках и другой информацией. В включены FORMAT_ и которые можно использовать для определения текущего стека вызовов PL/SQL и списка ошибок.

DBMS_WM Версия Описание Модуль предоставляет API для управления Works pace Manager. Эта утилита позволяет работать с длинными транзакциями 502 ПРИЛОЖЕНИЕ А в различных рабочих пространствах, где каждое рабочее пространство имеет отличную версию записей, измененных транзакцией.

DBMS_XMLSAVE и XMLGEN Версия Описание Эти три модуля предоставляют API для манипуляции и преоб разования данных XML. XMLGEN преобразует запрос SQL в формат XML, a аналогичен XMLGEN за исключением того, что написан на С, а не на PL/SQL. преобразует XML в данные базы данных.

DEBUG_EXTPROC Версия Описание Модуль используется при отладке внеш ней процедуры. Он предоставляет единственную процедуру STARTUP_ EXTPROC_AGENT, которая запускает агента внешней процедуры. К нему можно подключиться в отладчике перед выполнением внешней процеду ры.

SDO_CS, SDO_GEOM, SDE_LRS, и SDO_TUNE " Версия Описание Эти модули обеспечивают доступ и управление различными пространственными свойствами Oracle. Они устанавливаются в схему mdsys, а не sys.

Версия г Описание Модуль UTL_COLL содержит единственную функцию используемую для определения, является ли ее аргумент на самом деле локатором сборной конструкции или нет.

UTL_ENCODE Версия Описание Модуль служит для кодирования и декодирова ния данных RAW в стандартный формат, который может пересылаться между хостами. Он предоставляет три способа кодирования: base64, uuencode и quoted printable. Эти форматы часто используются для коди рования тела e-mail.

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

может записывать только текстовые файлы;

он не поддержива ет двоичные файлы.

UTL_HTTP Версия 7. Описание Модуль служит для формирования HTTP-вызовов в PL/SQL или SQL. Он применяется для вызова картриджей в Oracle In ternet Application Server, а также web-страниц в Интернете. В определены две функции: REQUEST и REQUEST_PIECES. REQUEST изв лекает до 2000 первых байтов данных указанной страницы Web, a REQUEST_PIECES извлекает всю страницу в таблицу PL/SQL. В и выше для REQUEST и могут использоваться прокси.

Версия Описание Модуль UTLJNADDR используется для адресации в Интерне те. Он предоставляет две функции: GET_HOST_NAME, которая возвра щает имя хоста по заданному IP-адресу;

и которая возвращает IP-адрес хоста по заданному имени.

UTL_PG Версия 7. Описание Модуль UTL_PG обеспечивает преобразование числовых данных языка COBOL в числа Oracle. Он часто используется совместно с модулем UTL_RAW.

UTL_RAW Версия 7. Описание В модуле UTL_RAW содержатся служебные подпрограммы для работы с данными типа RAW и для преобразования данных в типы RAW и обратно. Он дополняет встроенные функции RAWTOHEX и HEXTORAW модуля STANDARD.

504 ПРИЛОЖЕНИЕ А UTL_REF Версия Описание Модуль служит для работы с объектными ссылками в PL/SQL. В отличие от SQL при этом не нужно знать имя объектной таблицы. предоставляет процедуры для выбора, блокирования, обновления и удаления объектов на основе их ссылок.

Версия г Описание Модуль предоставляет реализацию протокола SMTP, который используется для отправки сообщений e-mail. Для от правки e-mail он обеспечивает связь с сервером SMTP, расположенным вне базы данных.

Версия г Описание Модуль UTL_TCP предоставляет реализацию протокола TCP, который используется для обычных Например, UTL_HTTP и UTL_SMTP написаны для внутреннего применения UTL_TCP. может использоваться для определения собственно го протокола соединения с удаленным хостом.

Версия Описание Модуль используется для кодирования и раскодиро вания заданного UTL (универсальный указатель ресурса). В кодированном недопустимые символы заменяются числовым кодом с префиксом ПРИЛОЖЕНИЕ В Зарезервированные слова PL /SQL 506 ПРИЛОЖЕНИЕ В перечисленные в данном приложении, являются зарезервиро ванными словами PL/SQL. Зарезервированные слова имеют специальное синтаксическое значение в этом языке и потому не могут использоваться в качестве идентификаторов (имен переменных, имен процедур и т.д.).

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

Таблица зарезервированных слов В следующей таблице перечислены зарезервированные слова PL/SQL, применяемые в Oracle. В зарезервированных слов был удален из этого списка за ненадобностью. Однако в более ранних версиях они считаются зарезервированными. Кроме того, в и добавлены новые слова (например, AUTHID и В этой таблице слова, зарезервированные в выделены жирным шрифтом, а слова, зарезервированные в SQL, — звездочкой (*). не выделенные жирным шрифтом, зарезервированы в более ранних верси ях. Для снижения риска возможных конфликтов следует избегать исполь зования этих слов.

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

ABORT ACCEPT ACCESS* ADD* ALL* ALTER* AND* ANY* ARRAY ARRAYLEN AS* ASC* ASSERT ASSIGN AT AUDIT* AUTHID AUTHORIZATION Average BEGIN BETWEEN* BODY BOOLEAN BULK BY* CASE CHAR* CHECK* CLOSE CLUSTER* CLUSTERS COALESCE COLLECT COLUMN* COMMENT* COMMIT COMPRESS* CONNECT* CONSTANT CRASH CREATE* CURRENT* CURRVAL CURSOR DATABASE DATE* DAY DBA DEBUGOFF DEBUGON DECIMAL* DECLARE DEFAULT* DEFINITION DELAY DELETE* DESC* DIGITS DISPOSE Зарезервированные слова PL/SQL DISTINCT* DO DROP* ELSE* END ENTRY EXCEPTION EXCLUSIVE* EXECUTE EXISTS* EXIT EXTENDS EXTRACT FALSE FETCH FILE* FLOAT* FOR* FORM* FROM* FUNCTION GENERIC GOTO GRANT* GROUP* HAVING* HEAP HOUR IDENTIFIED* IF IMMEDIATE* IN* INCREMENT* INDEX* INDEXES INDICATOR INITIAL* INSERT* INTEGER* INTERFACE INTERSECT* INTERVAL INTO* IS* ISOLATION JAVA LEVEL* LIKE* LIMITED LOCK* LONG* LOOP MAX MINUS* MINUTE MOD MODE* MONTH NATURAL NATURALN NEW NOCOMPRESS* NOCOPY NOT* NOWAIT* NULL* NUMBER* OCIROWID OF* OFFLINE* ON* ONLINE* OPAQUE OPEN OPERATOR OPTION* OR* ORDER* ORGANIZATION OTHERS OUT PACKAGE PARTITION PCTFREE* POSITIVE POSITIVEN PRAGMA PRIOR* PRIVATE PRIVILEGES* PROCEDURE PUBLIC* RAISE RANGE RAW* REAL RECORD REF RELEASE REMR RENAME* RESOURCE* RETURN REVERSE REVOKE* ROLLBACK ROW* ROWNUM ROWS* RUN SAVEPOINT SCHEMA SECOND SELECT* SEPARATE SESSION* SET* SHARE* SPACE SQL SQLCODE START* STATEMENT STDDEV SUBTYPE SUCCESSFUL* SUM SYNONYM* SYSDATE* TABAUTH TABLE* TABLES* TASK TERMINATE THEN* TIME 508 ПРИЛОЖЕНИЕ В TIMEZONE_HOUR TO* TRIGGER* TRUE TYPE UNION* UNIQUE* UPDATE* USE USER* * VALIDATE* VALUES* VARCHAR* VARCHAR VARIANCE VIEW* VIEWS WHEN WHENEVER* WHERE* WHILE WITH* WORK WRITE XOR YEAR ZONE Если необходимо воспользоваться зарезервированным словом, его нужно заключить в двойные кавычки. Например, следующий блок вполне корректен:

Г) "BEGIN" NUMBER;

BEGIN "BEGIN" := 7;

END;

Однако делать так все же не рекомендуется.

ПРИЛОЖЕНИЕ С Словарь данных 510 ПРИЛОЖЕНИЕ С этом приложении описываются представления словаря данных, ко В торые применяются в процессе программирования на PL/SQL. Здесь приведены не все представления, а только наиболее используемые. Кро ме того, дается краткое описание словаря данных и принципов его функ ционирования.

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

Словарь данных создается, как правило, одновременно с созданием и инсталляцией базы данных. Без него программы PL/SQL работать не смо гут. В большинстве систем представления словаря данных создаются с мощью сценария который выполняется как часть процесса установки базы данных. В системах Unix файл находится в ка талоге Сценарий должен запускаться на выполне ние либо пользователем SYS, либо соединением с Более подробно о представлениях словаря данных (в том числе и о тех, которые не рассматриваются здесь, а также о представлениях выпол нения v$) рассказывается в руководстве "Oracle Sever Reference".

Соглашения по именованию Многие из представлений имеют по три различных экземпляра, обозна чаемых как all_* и К примеру, в трех экземплярах находят ся сведения об исходном программном тексте хранимых объектов: в виде представлений и Вообще говоря, в представлениях типа содержится информация об объектах, владе льцем которых является текущий в представлениях типа 1_* — информация обо всех объектах, доступных текущему пользовате лю (не всегда ему принадлежащих), а в представлениях типа dba_* — ин формация обо всех объектах базы данных.

SQL и PL/SQL не различают регистр символов. Для реализации этого свойства перед сохранением информации об объектах она преобразуется в символы верхнего регистра (если не заключена в двойные кавычки).

Поэтому при обращении с запросом к словарю данных следует исполь зовать символы именно верхнего регистра. Например, в представлении имеется столбец в котором имена объектов хра нятся в виде символов верхнего регистра. Следующий сеанс показывает запрос к представлению Словарь данных SQL> SELECT status 2 FROM user_objects 3 WHERE = OBJECT_TYPE STATUS PACKAGE VALID PACKAGE VALID Обратите внимание на использование функции UPPER: благодаря ей запрос возвращает нужные строки (модуль ClassPackage описан в главе 9).

Полномочия Владельцем представлений словаря данных является пользователь SYS.

По умолчанию все представления могут видеть только пользователь SYS и пользователи с системной привилегией DBA. Пользователи, не имею щие привилегии DBA, могут просматривать представления типа all_* и некоторые другие. Просматривать представления такие поль зователи могут лишь в том случае, если им предоставлена привилегия SELECT на конкретное представление.

Представления словаря данных не должны обновляться даже пользо вателем SYS. Они обновляются автоматически базой данных при измене нии соответствующей информации. Oracle предоставляет сценарии для изменения таблиц словаря данных при модернизации (или наоборот при переходе к более низкой версии) базы данных. Например, u0801070.sql применяется при переходе от базы данных версии 8.1.7 к текущей вер сии. Эти сценарии находятся в том же каталоге, что и Типы представлений Представления словаря данных можно сгруппировать по перечисленным ниже категориям. Словарь данных содержит информацию об объектах базы данных различных типов, а также об отношениях между ними.

• Реляционные кластеры, таблицы и • Сборные объекты LOB • Представления г и г • Другие объекты базы данных • Разделы и подразделы • Индексы • Материализованные представления, итоги и моментальные снимки • Подпрограммы, методы и триггеры • Исходный программный код и ошибки компиляции • Зависимости и ограничения • Статистика и аудит • Привилегии и полномочия ПРИЛОЖЕНИЕ С Внимание Не все представления словаря данных приведены в этом приложении. Полный список доступных представлений можно найти в "Oracle Server Reference". Можно также сделать запрос к представлению dictionary, которое содержит имена и описания всех доступных представлений словаря данных.

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

• Тип объекта Тип объекта базы данных, описываемого представ лением • Представление словаря данных Имя представления • Описываемые объекты Объекты, описываемые этим представ лением Редакция Редакция Oracle, в которой впервые появилось это представление Реляционные кластеры, таблицы и представления Представления словаря данных этой категории описывают базовые реля ционные объекты хранения данных в Oracle — кластеры, таблицы и представления.

Тип объекта Представление Описываемые объекты Редакция словаря данных Кластеры Доступные кластеры базы данных Все кластеры базы данных user clusters Кластеры, принадлежащие текущему для доступных expressions кластеров кластеров expressions Хэш-функции для кластеров, expressions принадлежащих текущему пользователю Отображение столбцов таблицы на столбцы кластера для всех таблиц user columns Отображение столбцов таблицы на столбцы кластера для таблиц текущего пользователя Словарь данных Тип объекта Представление Описываемые объекты Редакция словаря данных Таблицы all_all_tables. Доступные таблицы (реляционные и представления и объектные) Все таблицы (реляционные и объектные) Oracle базы данных Таблицы (реляционные и объектные) текущего пользователя Комментарии для столбцов доступных таблиц и представлений Комментарии для столбцов всех таблиц и представлений Комментарии для столбцов таблиц и представлений, принадлежащих текущему пользователю all_partial_ Доступные таблицы, которые были частично удалены Все таблицы, которые были частично drop_tabs удалены Таблицы, принадлежащие текущему пользователю и частично удаленные all_refs Ссылочные (REF) столбцы и атрибуты ъ доступных столбцах объектных типов dba_refs Все ссылочные (REF) столбцы и атрибуты в базе данных, user_refs Ссылочные (REF) столбцы и атрибуты столбцов объектных типов, принадлежащих текущему пользователю Столбцы доступных таблиц Столбцы всех таблиц Столбцы таблиц, принадлежащих текущему пользователю Комментарии для доступных таблиц Комментарии для всех таблиц базы данных Комментарии для таблиц, принадлежащих текущему пользователю all_tables Доступные реляционные таблицы dba_tables Все реляционные таблицы Реляционные таблицы, принадлежащие текущему пользователю ПРИЛОЖЕНИЕ С Редакция Тип объекта Представление Описываемые объекты словаря данных Доступные таблицы, содержащие неиспользуемые столбцы Все таблицы, содержащие col_tabs неиспользуемые столбцы Таблицы, принадлежащие текущему col_tabs пользователю и содержащие неиспользуемые столбцы Столбцы, обновляемые в доступных columns представлениях с соединениями dba_updatable_ Столбцы, обновляемые во всех columns представлениях с соединениями user_updatable_ Столбцы, обновляемые в тех columns представлениях с соединениями, которые принадлежат текущему пользователю all_views Доступные представления dba_views Все представления в базе данных Представления, принадлежащие текущему пользователю Сборные конструкции, объекты объектные типы и таблицы В этих представлениях словаря данных описаны доступные в и более старших версиях объектные конструкции: сборные конструкции, объекты LOB и объектные типы:

Тип объекта Представление Описываемые объекты Редакция словаря данных Сборные all_coll_types Доступные именованные типы конструкции сборных конструкций dba_coll_types Все типы сборных конструкций в базе данных Типы сборных конструкций, принадлежащие текущему пользователю Доступные таблицы, содержащие столбцы varray типов varray (изменяемые массивы) dba_varrays Все таблицы в базе данных, содержащие столбцы varray Словарь данных Тип объекта Представление Описываемые объекты Редакция словаря данных Таблицы, содержащие столбцы varray и принадлежащие текущему пользователю Вложенные таблицы, содержащиеся в доступных таблицах Вложенные таблицы, содержащиеся во всех таблицах базы данных Вложенные таблицы, которые tables содержатся в таблицах, принадлежащих текущему пользователю Большие объекты all_lobs Объекты содержащиеся в доступных таблицах Все объекты LOB в базе данных lobs Объекты LOB, которые содержатся в таблицах, принадлежащих текущему пользователю Объектные таблицы all_type_attrs Атрибуты доступных объектных типов и типы dba_type_attrs Атрибуты всех объектных типов Атрибуты объектных типов, принадлежащих текущему пользователю Методы доступных объектных типов Методы всех объектных типов Методы объектных типов, принадлежащих текущему пользователю Доступные объектные типы dba_types Все объектные типы Объектные типы, принадлежащие текущему пользователю all_object_tables Доступные объектные таблицы dba_object_tables Все объектные таблицы user_object_tables Объектные таблицы, принадлежащие текущему пользователю Представления и В этих представлениях содержится информация о различных типах объек тов базы данных, появившихся в включая следующие:

• Контексты 516 ПРИЛОЖЕНИЕ С • Размерности • Внешние таблицы • Операции • Контуры • Политики За дополнительными сведениями обращайтесь к документации Oracle, Тип объекта Представление Описание Редакция словаря данных Контексты all_context Доступные контексты Все контексты Размерности Доступные размерности Все размерности в базе данных Размерности, принадлежащие текущему пользователю Отношение между уровнями размерностей и зависимыми столбцами для доступных размерностей Отношение между уровнями размерностей и зависимыми столбцами для всех размерностей Отношение между уровнями размерностей и зависимыми столбцами для размерностей текущего пользователя Отношения между уровнями доступных размерностей Отношения между уровнями всех размерностей Отношения между уровнями размерностей текущего пользователя Доступные иерархии размерностей Все иерархии размерностей Иерархии размерностей текущего пользователя Соединения между доступными размерностями Соединения между всеми размерностями Соединения между размерностями текущего пользователя Уровни доступных размерностей Уровни всех размерностей Словарь данных Тип объекта Представление Описание Редакция словаря данных Уровни размерностей текущего пользователя Столбцы доступных уровней размерностей Столбцы всех уровней размерностей Столбцы уровней размерностей текущего пользователя Внешние all_external_tables Внешние таблицы, доступные текущему таблицы пользователю dba_external_tables Все внешние таблицы в базе данных Внешние таблицы, принадлежащие текущему пользователю Операции Служебная информация для доступных операций dba_opancillary Служебная информация для всех операций Служебная информация для операций текущего пользователя Аргументы доступных операций Аргументы всех операций Аргументы операций текущего пользователя Функции привязки для доступных операций Функции привязки для всех операций Функции привязки для операций текущего пользователя all_operators Базовая информация для доступных операций Базовая информация для всех операций Базовая информация для операций текущего пользователя Контуры Указания, составляющие доступные контуры Указания, составляющие все контуры Указания, составляющие контуры текущего пользователя all_outlines Доступные контуры Все контуры Контуры, принадлежащие текущему пользователю ПРИЛОЖЕНИЕ С Тип объекта Представление Описание Редакция словаря данных Политики all_policies Политики доступных таблиц и представлений Политики всех таблиц и представлений Политики таблиц и представлений текущего пользователя Другие объекты базы данных В представлениях словаря данных, приведенных в следующей таблице, содержится информация об остальных типах объектов базы данных. В их числе:

• Задания базы данных • Связи баз данных • Каталоги • Библиотеки • Последовательности • Синонимы Тип объекта Представление Описание Редакция словаря данных Задания all_jobs Доступные задания базы данных базы данных Все задания базы данных Задания базы данных, отправленные текущим пользователем Все задания базы данных, выполняемые в данный момент Связи баз данных Доступные связи базы данных Все связи базы данных Связи базы данных, принадлежащие текущему пользователю Каталоги rectories Доступные каталоги dba_directories Все каталоги базы данных Библиотеки all_libraries Доступные библиотеки dba_libraries Все библиотеки Библиотеки, принадлежащие текущему пользователю Последовательности all_sequences Доступные последовательности Все последовательности Последовательности, принадлежа текущему пользователю Словарь данных Тип объекта Представление Описание Редакция словаря данных Синонимы Доступные синонимы Все синонимы в базе данных Синонимы, принадлежащие текуще му пользователю Разделы и подразделы Разделы, предлагаемые в позволяют разбивать таблицы на раз ные части, каждая из которых может храниться в собственной области. В г появились подразделы, а также возможность хранить в разделах объекты LOB. Приводимые ниже представления словаря данных содер жат информацию о разделах и подразделах различных объектов базы данных.

Представление Описание Редакция словаря данных Статистика и другая информация о разделах в доступных таблицах Статистика и другая информация о разделах во всех таблицах базы данных Статистика и другая информация о разделах в таблицах, принадлежащих текущему пользователю Гистограммы разделов доступных таблиц Гистограммы разделов всех таблиц базы данных Гистограммы разделов таблиц текущего пользователя Разделение на уровне объектов всех доступных разделенных индексов Разделение на уровне объектов всех разделенных индексов Разделение на уровне объектов разделенных индексов текущего пользователя Столбцы ключей разделения всех доступных разделенных объектов Столбцы ключей разделения всех разделенных объектов Столбцы ключей разделения разделенных объектов текущего пользователя Разделы данных LOB в доступных таблицах Разделы данных LOB во всех таблицах Разделы данных LOB в таблицах текущего пользователя 520 ПРИЛОЖЕНИЕ С Представление Описание Редакция словаря данных all_part_tables Доступные разделенные таблицы Все разделенные таблицы dba_part_tables Разделенные таблицы, принадлежащие Oracle текущему пользователю Статистика о столбцах для доступных подразделов Статистика о столбцах для всех подразделов user_subpart_col_ Статистика о столбцах для подразделов таблиц, statistics принадлежащих текущему пользователю Данные гистограмм для доступных подразделов Данные гистограмм для всех подразделов Данные гистограмм для подразделов таблиц, принадлежащих текущему пользователю Ключевые столбцы для доступных таблиц, разделенных составным методом Ключевые столбцы для всех таблиц, разделенных составным методом Ключевые столбцы для таблиц текущего пользователя, разделенных составным методом Разделы доступных таблиц Разделы всех таблиц Разделы таблиц текущего пользователя Подразделы доступных таблиц Подразделы всех таблиц Подразделы таблиц текущего пользователя all_lob_partitions Разделы LOB, содержащихся в доступных таблицах Разделы всех LOB Разделы LOB, содержащихся в таблицах текущего пользователя Подразделы LOB, содержащихся в доступных таблицах dba_lob_subpartitions Подразделы всех LOB Подразделы LOB, содержащихся в таблицах текущего пользователя Информация об индексных разделах для индексов доступных таблиц Информация об индексных разделах для индексов всех таблиц Словарь данных Представление Описание Редакция словаря данных Информация об индексных разделах для индексов таблиц текущего пользователя Информация об индексных подразделах для индексов доступных таблиц Информация об индексных подразделах для индексов всех таблиц Информация об индексных подразделах для индексов таблиц текущего пользователя Индексы В ниже таблице перечислены представления словаря дан ных, содержащие информацию об индексах базы данных. За сведениями о представлениях, описывающих индексные разделы и подразделы, обра щайтесь к предыдущей а об индексах вообще — к документации Oracle.

Представление Описание Редакция словаря данных Столбцы индексов доступных таблиц Столбцы индексов всех таблиц Столбцы индексов таблиц текущего пользователя Функциональные индексные выражения для индексов доступных таблиц Функциональные индексные выражения для индексов всех таблиц Функциональные индексные выражения для индексов таблиц, принадлежащих текущему пользователю Индексы доступных таблиц dba_indexes Индексы всех таблиц Индексы таблиц текущего пользователя all_indextypes Доступные индексные типы dba_indextypes Все индексные типы user_indextypes Индексные типы текущего пользователя Операции, поддерживаемые доступными индексными типами Операции, поддерживаемые всеми индексными типами Операции, поддерживаемые индексными типами текущего пользователя 522 ПРИЛОЖЕНИЕ С Материализованные представления, сводки и моментальные снимки Моментальные снимки впервые появились в а в они были расширены материализованными представлениями и сводками. В приведенной ниже таблице описаны представления словаря данных, со держащие информацию об объектах этих типов.

Pages:     | 1 |   ...   | 4 | 5 || 7 |



© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.