Если канал не существует, то при первом указании его имени в SEND_MESSAGE он создается неявным образом. В PL/SQL версии 2.2 и выше каналы можно создавать и удалять явно, с помощью процедур CREATE_PIPE и REMOVE_PIPE.
Программный канал представляет собой структуру данных, находящуюся в разделяемом пуле системной глобальной области (SGA – system global area) памяти. Поэтому он не занимает память, в которую могут помещаться другие объекты базы данных при их считывании с диска. Когда необходимо освободить дополнительное пространство разделяемого пула, каналы автоматически уничтожаются. Однако это касается только тех каналов, в которых не находятся сообщения, ожидающие считывания (хотя канал можно удалить из SGA и явным образом, с помощью процедуры PURGE, описанной ниже). Алгоритмом уничтожения программных каналов является алгоритм LRU (least recently used – использовавшийся раньше всех): уничтожается тот канал, который не использовался дольше всех. Максимальный размер канала и, следовательно, размер структуры данных в разделяемом пуле задается параметром MAXPIPESIZE функций SEND_MESSAGE и CREATE_PIPE.
Каналы, создаваемые неявно с помощью SEND_MESSAGE, называются общими (public). Любой пользователь, имеющий полномочие EXECUTE на модуль DBMS_PIPE и знающий имя канала, может посылать и принимать по нему сообщения. Доступ же к частным (private) каналам ограничивается пользователем, создавшим этот канал, хранимыми процедурами, выполняющимися на основании набора привилегий владельца этого канала, и пользователями, присоединившимися как SYSDBA или INTERNAL.
В PL/SQL версий 2.0 и 2.1 применяются только общие каналы, создаваемые неявно. В PL/SQL версии 2.2 и выше можно уже создавать каналы явно, используя для этого функцию CREATE_PIPE. Эта функция является единственным способом создания частного канала, однако при желании ей можно воспользоваться и для создания общего канала. Каналы, создаваемые посредством CREATE_PIPE, остаются в разделяемом пуле до тех пор, пока не будут явно удалены с помощью функции REMOVE_PIPE или пока экземпляр базы данных не будет остановлен. Такие каналы автоматически не уничтожаются в SGA. Описание CREATE_PIPE выглядит следующим образом:
function CREATE_PIPE (pipename in varchar2,
maxpipesize in integer default 8192,
private in boolean default true)
return integer;
Если канал успешно создан, CREATE_PIPE возвращает ноль. Если канал уже существует, а текущий пользователь имеет привилегии, необходимые для доступа к нему, то возвращается ноль и данные, находящиеся в канале, остаются без изменений. Если существует общий канал с указанным именем или частный канал, имеющий то же имя и принадлежащий другому пользователю, то устанавливается ошибка “ORA-23322: insufficient privilege to access pipe” (привилегии, недостаточные для доступа к каналу) и функция завершается неуспешно. Параметры этой функции описаны в следующей таблице:
Таблица 17 Параметры функции CREATE_PIPE
Параметр
Тип
Описание
pipename
varchar2
Имя создаваемого канала. Имена каналов ограничены 30 символами. Имена, начинающиеся с ORA$, зарезервированы для внутреннего использования.
maxpipesize
integer
Максимальный размер канала в байтах. Этот же параметр используется в SEND_MESSAGE для неявного создания канала. Значение по умолчанию – 8 192 байта. Если SEND_MESSAGE вызывается со значением, превышающим MAXPIPESIZE, размер канала увеличивается. Если же SEND_MESSAGE вызывается со значением меньшим, чем MAXPIPESIZE, то сохраняется существующий размер.
private
boolean
TRUE для частного канала, в противном случае FALSE. Значение по умолчанию – TRUE. Общие каналы создаются неявно функцией SEND_MESSAGE, поэтому, как правило, не имеет смысла устанавливать для данного параметра значение FALSE.
Каналы, создаваемые явно функцией СКЕАТЕ_РIРЕ, удаляются с помощью функции REMOVE_PIPE. Если при этом в канале находятся сообщения, то они также удаляются. Эта функция – единственный способ удалить те каналы, которые были созданы явно. Описание функции REMOVE_PIPE выглядит следующим образом:
function REMOVE_PIPE (pipename in varchar2)
return integer;
Единственным параметром этой функции является имя удаляемого канала. Если канал существует, а текущий пользователь имеет на него привилегии, то канал удаляется и функция возвращает ноль. Если канал не существует, также возвращается ноль. Если канал существует, но текущий пользователь не имеет привилегий на доступ к нему, то устанавливается ошибка ORA-23322 (как и в функции CREATE_РIРЕ).
С помощью процедуры PURGE можно удалить содержимое канала, не уничтожая его самого. Если канал создан неявно, то, поскольку теперь он пуст, его можно удалить из разделяемого пула в соответствии с алгоритмом LRU. Процедурой PURGE несколько раз вызывается RECEIVE MESSAGE, поэтому содержимое локального буфера сообщений может быть переписано. PURGE описывается следующим образом: