oracle系統包——DBMS_PIPE用法


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM