Oracle plsql session間通訊處理

regonly1發表於2009-11-27
Oracle中,要實現session間的通訊,並不能像C++或java一樣直接實現。而要透過dbms_pipe或dbms_alert包實現。
dbms_pipe的概念類似於unix下的管道,可以非同步輸出中間結果。
dbms_pipe的用途:
我們知道,在plsql執行過程中,如果一個事務正在處理中,是不能獲取中間輸出的資訊的,如:dbms_output的輸出。這樣的話我們就無法知道這個事務到底處理到了什麼步驟。
此時,就可以使用dbms_pipe來實現這樣的需求了。由於這個包是用於session間通訊的,說明在事務處理過程中,可以將對應的資訊打包傳送。而另外的session可以根據指定管道的名稱來獲得這些內容。
傳送方具體實現步驟如下:
建立管道:
v_status := create_pipe(pipe_name);
--pipe_name:管道名稱
返回結果:0:成功;ora-23322表示對應管道名稱已經存在。

打包要傳送的訊息:
pack_message(msg_content);
--msg_content:要傳送的訊息內容
可以為varchar2、number、rowid、date、raw、nchar中的一種。

根據指定的管道傳送訊息:
send_message(pipe_name);
--pipe_name:指定要傳送訊息的管道的名稱
返回結果:0:成功;1:超時;3:中斷;ora-23322

接收方具體實現:
receive_message(pipe_name);
--pipe_name:即指定要訊息來源的管道的名稱;

next_item_type();
--返回接收的訊息的資料型別
返回結果:
0:no more items;
6:number;
9:varchar2;
11:rowid;
12:date;
23:raw;

解包:
unpack_message(item);
對應的item的型別要由前面next_item_type所決定。然後輸出即可。
另外,在plsql dev上,還可以透過Event monitor工具來觀察管道的輸出。即可省去手動解包的過程。

dbms_alert也可以實現類似的功能,區別在於dbms_alert需要事務中執行commit後才能傳送訊息。而且支援的資料格式也只有文字形式,而不能像dbms_pipe可以支援date、rowid等其他型別。

詳細內容參考:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12932950/viewspace-620812/,如需轉載,請註明出處,否則將追究法律責任。

相關文章