| 導購 | 订阅 | 在线投稿
分享
 
 
 

使用Oracle實現實時通信

來源:互聯網  2008-05-19 08:58:34  評論

由于Oracle不提供用于實時輸出消息的工具, Oracle數據庫開發者總是要面臨實時監視他們的儲備過程執行的挑戰。他們必須使用dbms_output.put_line調用,這個調用直到過程完成才返回結果。

在本文中,我想演示如何從Oracle8i數據庫直接發送電子郵件,作爲一種實時通信解決方案。這樣我們要監視存儲過程就不再需要等待它們完成了,這樣的方法還爲開發者提供了其他的一些好處:

. 可以在幾分鍾內調試一些很長的批處理過程,而不需要等幾個小時;

. 計算用于指定代碼塊所需的執行時間;

這就需要解決一個問題,我們如何從運行的存儲過程中輸出消息以便我們可以即時檢查它們,即使我們不在辦公場所?我們的做法是把所有必需的過程與函數包裝在自定義的包中,然後使用Oracle8i UTL_SMTP包直接地從Oracle數據庫中發送電子郵件。下面我將詳細講解一些這個過程。

Oracle的UTL_SMTP包

在Oracle8i中引入了UTL_SMTP包(SMTP代表Simple Mail Transfer Protocol簡單郵件傳送協議,使用TCP端口25在客戶機和服務器之間建立通信聯絡),使開發者能夠從數據庫發送電子郵件。

只有安裝帶有Java虛擬機(JVM)的8i或更高的版本才能使用UTL_SMTP。 此外還必須把plsql.jar載入數據庫中。否則,當調用UTL_SMTP API來發送電子郵件的時候我們將得到下面的異常:ORA - 29540 : class oracle/plsql/net/TCPConnection does not exist。

默認的$ORACLE_HOME/javavm/install/initjvm.sql腳本(安裝了JVM)不運行把plsql.jar載入數據庫的initplsj.sql腳本。系統用戶或者內部用戶可以手工運行$ORACLE_HOME/RDBMS/ADMIN/initplsj.sql腳本以解決這個問題。 如果你沒有可用的腳本,你要麽可以從Oracle支持那裏得到它,要麽可以簡單地直接使用loadjava載入實用程序plsql.jar:

loadjava -user sys/password@database -resolve plsql/jlib/plsql.jar

UTL_SMTP API:

本文的代碼中使用了下列UTL_SMTP包中的API:

OPEN_CONNECTION():打開到簡單郵件傳送協議服務器的連接。

HELO():執行連接之後建立與簡單郵件傳送協議服務器初始的收發關系功能,它能識別發送到服務器的「信使」。

MAIL():初始化與服務器的郵件交換,但是事實上不發送消息。

RCPT():識別消息的接受者。爲了把一條消息發送到多個接受者,你必須多次調用這個過程。

DATA():指定電子郵件的內容。

QUIT():終止一個SMTP會話並且斷開與服務器的連接。

爲了利用應用程序編程接口,把下面的調用按照給定的順序放入程序中:

調用 OPEN_CONNECTION

調用 HELO

調用 MAIL

調用 RCPT for each recipient

格式化電子郵件的內容然後調用MAIL

調用 QUIT

EmailUtils包規範

EmailUtils包包括下列API:

SetSender/GetSender-設置/取得發送者

SetRecipient/GetRecipient -設置/取得接受者

SetCcrecipient/GetCcrecipient -設置/取得抄件接受者

SetMailHost/GetMailHost -設置/取得郵件主機

SetSubject/GetSubject -設置/取得主題

Send-發送郵件

代碼1說明了EmailUtils包的規範:

create or replace package EmailUtils as

procedure SetSender(pSender in varchar2);

function GetSender

return varchar2;

procedure SetRecipient(pRecipient in varchar2);

function GetRecipient

return varchar2;

procedure SetCcRecipient(pCcRecipient in varchar2);

function GetCcRecipient

return varchar2;

procedure SetMailHost(pMailHost in varchar2);

function GetMailHost

return varchar2;

procedure SetSubject(pSubject in varchar2);

function GetSubject

return varchar2;

procedure Send(pMessage in varchar2);

procedure Send(pSender in varchar2,

pRecipient in varchar2,

pMailHost in varchar2,

pCcRecipient in varchar2 := null,

pSubject in varchar2 := null,

pMessage in varchar2 := null);

end EmailUtils;

/

可以看出,Send過程是重載過程:包規範中包括這個過程的兩個版本。 一個版本當至少三個強制性參數要規定的時候引用,pSender,pRecipient和pMailHost:

procedure Send(pSender in varchar2,

pRecipient in varchar2,

pMailHost in varchar2,

pCcRecipient in varchar2 := null,

pSubject in varchar2 := null,

pMessage in varchar2 := null);

  由于Oracle不提供用于實時輸出消息的工具, Oracle數據庫開發者總是要面臨實時監視他們的儲備過程執行的挑戰。他們必須使用dbms_output.put_line調用,這個調用直到過程完成才返回結果。   在本文中,我想演示如何從Oracle8i數據庫直接發送電子郵件,作爲一種實時通信解決方案。這樣我們要監視存儲過程就不再需要等待它們完成了,這樣的方法還爲開發者提供了其他的一些好處:   . 可以在幾分鍾內調試一些很長的批處理過程,而不需要等幾個小時;   . 計算用于指定代碼塊所需的執行時間;   這就需要解決一個問題,我們如何從運行的存儲過程中輸出消息以便我們可以即時檢查它們,即使我們不在辦公場所?我們的做法是把所有必需的過程與函數包裝在自定義的包中,然後使用Oracle8i UTL_SMTP包直接地從Oracle數據庫中發送電子郵件。下面我將詳細講解一些這個過程。   Oracle的UTL_SMTP包   在Oracle8i中引入了UTL_SMTP包(SMTP代表Simple Mail Transfer Protocol簡單郵件傳送協議,使用TCP端口25在客戶機和服務器之間建立通信聯絡),使開發者能夠從數據庫發送電子郵件。   只有安裝帶有Java虛擬機(JVM)的8i或更高的版本才能使用UTL_SMTP。 此外還必須把plsql.jar載入數據庫中。否則,當調用UTL_SMTP API來發送電子郵件的時候我們將得到下面的異常:ORA - 29540 : class oracle/plsql/net/TCPConnection does not exist。   默認的$ORACLE_HOME/javavm/install/initjvm.sql腳本(安裝了JVM)不運行把plsql.jar載入數據庫的initplsj.sql腳本。系統用戶或者內部用戶可以手工運行$ORACLE_HOME/RDBMS/ADMIN/initplsj.sql腳本以解決這個問題。 如果你沒有可用的腳本,你要麽可以從Oracle支持那裏得到它,要麽可以簡單地直接使用loadjava載入實用程序plsql.jar:   loadjava -user sys/password@database -resolve plsql/jlib/plsql.jar   UTL_SMTP API:   本文的代碼中使用了下列UTL_SMTP包中的API:   OPEN_CONNECTION():打開到簡單郵件傳送協議服務器的連接。   HELO():執行連接之後建立與簡單郵件傳送協議服務器初始的收發關系功能,它能識別發送到服務器的「信使」。   MAIL():初始化與服務器的郵件交換,但是事實上不發送消息。   RCPT():識別消息的接受者。爲了把一條消息發送到多個接受者,你必須多次調用這個過程。   DATA():指定電子郵件的內容。   QUIT():終止一個SMTP會話並且斷開與服務器的連接。   爲了利用應用程序編程接口,把下面的調用按照給定的順序放入程序中:   調用 OPEN_CONNECTION   調用 HELO   調用 MAIL   調用 RCPT for each recipient   格式化電子郵件的內容然後調用MAIL   調用 QUIT   EmailUtils包規範   EmailUtils包包括下列API:   SetSender/GetSender-設置/取得發送者   SetRecipient/GetRecipient -設置/取得接受者   SetCcrecipient/GetCcrecipient -設置/取得抄件接受者   SetMailHost/GetMailHost -設置/取得郵件主機   SetSubject/GetSubject -設置/取得主題   Send-發送郵件   代碼1說明了EmailUtils包的規範:   create or replace package EmailUtils as   procedure SetSender(pSender in varchar2);   function GetSender   return varchar2;   procedure SetRecipient(pRecipient in varchar2);   function GetRecipient   return varchar2;   procedure SetCcRecipient(pCcRecipient in varchar2);   function GetCcRecipient   return varchar2;   procedure SetMailHost(pMailHost in varchar2);   function GetMailHost   return varchar2;   procedure SetSubject(pSubject in varchar2);   function GetSubject   return varchar2;   procedure Send(pMessage in varchar2);   procedure Send(pSender in varchar2,   pRecipient in varchar2,   pMailHost in varchar2,   pCcRecipient in varchar2 := null,   pSubject in varchar2 := null,   pMessage in varchar2 := null);   end EmailUtils;   /   可以看出,Send過程是重載過程:包規範中包括這個過程的兩個版本。 一個版本當至少三個強制性參數要規定的時候引用,pSender,pRecipient和pMailHost:   procedure Send(pSender in varchar2,   pRecipient in varchar2,   pMailHost in varchar2,   pCcRecipient in varchar2 := null,   pSubject in varchar2 := null,   pMessage in varchar2 := null);   
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有