Как уже указывалось выше, сообщения посылаются в два этапа. Сначала данные упаковываются в локальном буфере сообщений, а затем содержимое буфера посылается по каналу. Упаковка данных осуществляется с помощью процедуры РАСК_MESSAGE, а посылка – с помощью функции SEND_MESSAGE.
Процедура РАСК_MESSAGE переопределяется различными типами элементов данных. На принимающей стороне канала процедура UNPACK_MESSAGE также переопределяется различными типами. Описание процедуры РАСК_MESSAGE выглядит следующим образом:
procedure PACK_MESSAGE (item in varchar2);
procedure РАСК_MESSAGE (item in number);
procedure PACK_MESSAGE (item in date);
Размер буфера равен 4096 байтам. Если общий размер упакованных данных превышает это значение, то генерируется ошибка “ORA-6558: Buffer in DBMS_PIPE package is full. No more items allowed” (Буфер модуля DBMS_PIPE заполнен. Ввод других элементов запрещен). Для каждого элемента данных в буфере отводится 1 байт для типа данных, 2 байта – для их длины, 1 дополнительный байт для завершения сообщения, а также пространство для самих данных. В ORACLE 8 и выше 2 байта необходимы для идентификатора набора символов и 1 дополнительный байт для формы набора символов. Таким образом, в ORACLE 8 для каждого элемента необходимо 7 вспомогательных байтов, а в ORACLE 7 – 4.
Когда после одного или нескольких вызовов РАСК_MESSAGE локальный буфер сообщений заполняется данными, его содержимое с помощью SEND_MESSAGE посылается по каналу:
function SEND_MESSAGE (pipename in varchar2, timeout in integer
default MAXWAIT,
maxpipesize in integer default 8192)
return integer;
Если программный канал еще не создан, то функция SEND_MESSAGE создает его. Каналы можно создавать и с помощью процедуры СRЕАТЕ_РIРЕ, которая применяется в РL/SQL версии 2.2 и выше и описана ниже в параграфе “Создание программных каналов и управление ими”. Параметры функции SEND_MESSAGE описаны в следующей таблице:
Таблица 12 Параметры функции SEND_MESSAGE
Параметр
Тип
Описание
pipename
varchar2
Имя канала; имена каналов ограничены 30 символами и не чувствительны к регистру символов.
timeout
integer
Задержка в секундах. Если в силу различных причин (указанных возвращаемым кодом) сообщение не может быть послано, то вызов возвращает число секунд после задержки. Значение по умолчанию DBMS_PIPE.MAXWAIT равно 86 400 000 секундам (1000 дней).
maxpipesize
integer
Общий размер канала в байтах. По умолчанию устанавливается равным 8 192 байтам (два сообщения максимального размера). Сумма размеров всех сообщений в канале не может превышать этого значения (когда сообщение получается с помощью RECEIVE_MESSAGE, оно удаляется из канала). После создания канала его максимальный размер становится элементом его описания и сохраняется на все время его существования. В разных вызовах SEND_MESSAGE можно указывать разные значения параметра MAXPIPESIZE. Если новое значение больше существующего размера, то размер канала увеличивается. Если же новое значение меньше, то сохраняется существующий размер.
Значение, возвращаемые функцией SEND_MESSAGE, описаны в таблице 13.
Сообщение успешно послано и при вызове RECEIVE_MESSAGE будет считано.
Вызов задержан. Это может произойти в том случае, если канал слишком заполнен, и сообщение передаться не может, либо если нельзя установить блокировку данного канала.