Программирование >>  Oracle 

1 ... 376 377 378 [ 379 ] 380 381 382 ... 469


1560

Приложение А

6 order by line

TEXT

package dbms output as

ОБЗОР

- Зти процедуры накапливают информацию в буфере (с помощью put

- и put line ) так, что ее можно выбрать в дальнейшем (с помощью

get line или get lines ) . Если пакет отключен, то все вызовы

- просто игнорируются. Так образом, эти подпрограммы активны,

- только если клиент способен обработать поучаемую информацию.

- Зто хорошо подходит для отладки или написания хран1х оце/р,

- с помощью которых выдаются сообщения или отчеты в среде sql*dba

- или plus (напрер, описательных процедур и т.п.) .

- Стандартный размер буфера - 20000. Миндальный - 2000, а

- максимальный -1000000 .

- ПРИМЕР

- Предположи, из триггера необходо выдать отладочную информацию.

- Для этого в триггере можно вызвать

dbms output.put line(Мы получили: :new.col - новое значение) ;

- Если клиент включил пакет dbms output, строка-аргумент put line

- будет помещена в буфер и клиент, выполнив оператор

(едположительно, оператор вставки, удаления или изменения,

- вызвавшего срабатывание триггера) , сможет выполнить

2 5 rows selected.

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

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



Пакеты DBMS ALERT и

DBMS PIPE

Пакеты DBMS ALERT и DBMS PIPE - очень мощные средства межпроцессного взаимодействия. Оба они обеспечивают возможность взаимодействия сеансов базы дан-н1х. Пакет DBMS ALERT по функциональности во многом аналогичен сигналам операционной системы UNIX, a DBMS PIPE очень похож на именованный канал UNIX. Поскольку разработчики приложений часто сомневаются, какой пакет в каких случаях использовать, я решил описать их вместе.

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

Пакет DBMS PIPE более универсален. Он позволяет одному или нескольким сеансам читать сообщения с одной стороны именованного канала и при этом записывать сообщения в этот канал с другой стороны. Только один из читающих сеансов может получить сообщение, причем адресовать сообщение конкретному сеансу по одному именованному каналу нельзя. Если читающих сеансов больше одного, прочитает записанное в канал сообщение любой из них. Каналы не поддерживают транзакции: если сообщение послано, оно будет доступным другим сеансам. Фиксировать транзакцию не



1562

Приложение А

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

Когда использовать сигналы и каналы

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

На экране в виде графической диаграммы отображаются данные о курсе акций.

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

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

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

На другой машине в сети работает процесс, выполняющий определенные действия.

Надо послать процессу сообщение с требованием выполнить необходимое действие. В этом случае канал базы данных используется аналогично сокету TCP/IP.

Необходимо поставить в очередь в области SGA данные, которые должны бгть

прочитаны и обработаны другим процессом. При этом канал базы данных используется как непостоянная очередь (FIFO), доступная для чтения нескольким различным сеансам.

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

Теперь, когда назначение сигналов и каналов понятно, рассмотрим детали реализации каждого из этих механизмов.

Настройка

Пакеты DBMS ALERT и DBMS PIPE стандартно устанавливаются в базе данных. В отличие от многих стандартных пакетов, привилегия EXECUTE для этих пакетов роли PUBLIC не предоставляется. В Oracle 8.0 и выше привилегия EXECUTE для этих пакетов предоставляется роли EXECUTE CATALOG ROLE. В предыдущих версиях никакие привилегии на эти пакеты по умолчанию не предоставлялись.

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



1 ... 376 377 378 [ 379 ] 380 381 382 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика