DBMS_PIPE包用於在同一例程(例項)的不同會話之間進行通訊;注意,如果使用者要執行包dbms_pipe中的過程和函式,則必須要為使用者授權。
sql>conn sys/oracle as sysdba; sql>grant execute on dbms_pipe to scott;
一、管道:
1)、公有管道:所有資料庫使用者可訪問。
2)、私有管道:只能建立管道的資料庫使用者可訪問。
二、DBMS_PIPE包的過程和函式解析
CREATE_PIPE:用於建立公用管道或私有管道。如果將引數private設定為TRUE,則建立私有管道;如果設定為FALSE,則建立公用管道。
eg:
declare falg int; begin flag:=dbms_pipe.create_pipe('public_pipe',8192,false); if flag=0 then dbms_output.put_line('建立公用管道成功'); end if; end; /
PACK_MESSAGE:用於將訊息寫入到本地訊息緩衝區
SEND_MESSAGE:用於將本地訊息緩衝區中的內容傳送到管道
RECEIVE_MESSAGE:用於接收管道訊息
NEXT_ITEM_TYPE:用於確定本地訊息緩衝區下一項的資料型別。
如果該函式返回0,則表示管道沒有任何訊息;
如果返回6,則表示下一項的資料型別為number;
如果返回9,則表示下一項的資料型別為varchar2;
如果返回11,則表示下一項的資料型別為rowid;
如果返回12,則表示下一項的資料型別為date;
如果返回23,則表示下一項的資料型別為raw.
UNPACK_MESSAGE:用於將訊息緩衝區的內容寫入到變數中.
REMOVE_PIPE:用於刪除已經建立的管道
PUGER:用於清除管道中的內容
RESET_BUFFER:用於復位管道緩衝區
UNIQUE_SESSION_NAME:用於為特定會話返回惟一的名稱,並且名稱的最長度為30位元組.
案例:
1、建立一個發訊息的過程:
CREATE OR REPLACE PROCEDURE SEND_MESSAGE(PIPENAME VARCHAR2, MESSAGE VARCHAR2) IS FLAG NUMBER; BEGIN FLAG := DBMS_PIPE.CREATE_PIPE(PIPENAME); IF FLAG = 0 THEN DBMS_PIPE.PACK_MESSAGE(MESSAGE); FLAG := DBMS_PIPE.SEND_MESSAGE(PIPENAME); END IF; END; /
2、建立一個接收訊息的包
CREATE OR REPLACE PROCEDURE RECEIVE_MESSAGE(PIPENAME VARCHAR2, MESSAGE OUT VARCHAR2) IS FLAG NUMBER; BEGIN FLAG := DBMS_PIPE.RECEIVE_MESSAGE(PIPENAME); IF FLAG = 0 THEN DBMS_PIPE.UNPACK_MESSAGE(MESSAGE); FLAG := DBMS_PIPE.REMOVE_PIPE(PIPENAME); END IF; END; /
3、執行包
--在一個會話中執行: exec send_message('pipe','I send message'); --在另一會話中執行: var message varchar2(200); exec receive_message('pipe',:message); print message;
執行結果如下:
PL/SQL procedure successfully completed
message
———
I send message