Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции СУБД.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
6.32 Mб
Скачать

Получение сообщений

Функции RECEIVE_MESSAGE и NEXT_ITEM_ТУРЕ и процедура UNPACK_MESSAGE модуля DBMS_PIPE используются для приема сообщений, посланных по каналу, а также для распаковки сообщений и превращения их в исходные элементы данных.

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

function RECEIVE_MESSAGE (pipename in varchar2,

timeout in integer

default MAXWAIT)

return integer;

Обычно RECEIVE_MESSAGE вызывается из принимающей программы. Если сообщения не ожидаются, то RECEIVE MESSAGE блокируется до тех пор, пока не считает сообщение. Таким образом, сеанс-получатель будет находиться в режиме ожидания до посылки сообщения по каналу. Принимающие программы похожи на процессы-демоны операционной системы. Демон также “засыпает” и “просыпается” только тогда, когда будет получено сообщение по программному каналу. Параметры функции RECEIVE_MESSAGE описаны в следующей таблице:

Таблица 14 Параметры функции RECEIVE_MESSAGE

Параметр

Тип

Описание

pipename

varchar2

Имя канала. Оно должно быть таким же, как и указанное в SEND_MESSAGE. На имя канала налагаются те же ограничения (длина менее 30 символов, нечувствительность к регистру символов).

timeout

integer

Максимальное время ожидания сообщения в секундах. Как и в SEND_MESSAGE, значение по умолчанию – MAXWAIT (1000 дней). Если параметр TIMEOUT равен 0, то значение RECEIVE_MESSAGE возвращается немедленно с состоянием 0 (сообщение считано) или 1 (задержка).

Коды, возвращаемые функцией RECEIVE_MESSAGE, описаны в таблице 15.

Таблица 15 Значения, возвращаемые функцией RECEIVE_MESSAGE

Возвращаемое значение

Описание

0

Сообщение успешно получено. Оно было считано в локальный буфер и может быть распаковано с помощью UNPACK_MESSAGE.

1

Задержка. За время ожидания RECEIVE_MESSAGE по каналу не было передано ни одного сообщения.

2

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

3

Вызов прерван из-за внутренней ошибки.

Функция NEXT_ITEM_TYPE возвращает тип данных следующего элемента в буфере. На основании этого значения можно решить, в какую переменную написать данные. Если тип известен заранее, то вызывать ее необязательно. Функция NEXT_IТЕМ_ТУРЕ описывается следующим образом:

function NEXT_ITEM_TYPE return integer;

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

Таблица 16 Возвращаемые коды функции NEXT_ITEM_TYPE

Возвращаемое значение

Описание

0

Элементов в буфере больше нет

6

Следующий элемент в буфере типа number

9

Следующий элемент в буфере типа varchar2

12

Следующий элемент в буфере типа date

Для распаковки принятых сообщений в модуле DBMS_PIPE предназначена процедура UNPACK_MESSAGE. Данная процедура является обратной по отношению к процедуре РАСК_MESSAGE. Подобно РАСК_MESSAGE, она переопределяется типами считываемых элементов. Описание процедуры UNPACK_MESSAGE выглядит следующим образом:

procedure UNPACK_MESSAGE (item out varchar2);

procedure UNPACK_MESSAGE (item out number);

procedure UNPACK_MESSAGE (item out date);

В ITEM записывается элемент данных из буфера. Если в буфере больше нет данных или если следующий элемент в буфере имеет не тот тип, который был запрошен, генерируется ошибка ORACLE ORA-6556 или ORA-6559. Перед установлением ошибки PL/SQL пытается преобразовать тип следующего элемента в нужный тип, используя формат преобразования, заданный по умолчанию.