Функции 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.
Сообщение успешно получено. Оно было считано в локальный буфер и может быть распаковано с помощью UNPACK_MESSAGE.
Задержка. За время ожидания RECEIVE_MESSAGE по каналу не было передано ни одного сообщения.
Сообщение в канале слишком велико для буфера. Это внутренняя ошибка, которая не происходит в обычных условиях.
Вызов прерван из-за внутренней ошибки.
Функция NEXT_ITEM_TYPE возвращает тип данных следующего элемента в буфере. На основании этого значения можно решить, в какую переменную написать данные. Если тип известен заранее, то вызывать ее необязательно. Функция NEXT_IТЕМ_ТУРЕ описывается следующим образом:
function NEXT_ITEM_TYPE return integer;
Возвращаемые коды описаны в следующей таблице:
Таблица 16 Возвращаемые коды функции NEXT_ITEM_TYPE
Возвращаемое значение
Описание
Элементов в буфере больше нет
Следующий элемент в буфере типа number
Следующий элемент в буфере типа varchar2
Следующий элемент в буфере типа 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 пытается преобразовать тип следующего элемента в нужный тип, используя формат преобразования, заданный по умолчанию.