使用Oracle實現實時通訊(轉)

gugu99發表於2007-08-13
使用Oracle實現實時通訊(轉)[@more@]

  由於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 asprocedure SetSender(pSender in varchar2);function GetSenderreturn varchar2;procedure SetRecipient(pRecipient in varchar2);function GetRecipientreturn varchar2;procedure SetCcRecipient(pCcRecipient in varchar2);function GetCcRecipientreturn varchar2;procedure SetMailHost(pMailHost in varchar2);function GetMailHostreturn varchar2;procedure SetSubject(pSubject in varchar2);function GetSubjectreturn 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);另一個版本只有當提供pMessage引數值時執行:

  procedure Send(pMessage in varchar2);

  第二個版本是用作除錯的版本。 所有的電子郵件訊息共用同樣的傳送者、接受者、郵件主機、抄送接受者和主題資訊,這些都是我在會話的開始的時候設定好的。 下面是一個PL/SQL程式塊的例子:


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

相關文章