使用Oracle實現實時通訊(轉)
由於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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle實時程式通訊(轉)Oracle
- Uniapp 使用 GoEasy 實現 websocket 實時通訊APPGoWeb
- Oracle實時程式通訊Oracle
- [譯] 實時通訊:使用 Spring Boot 實現 WebSocketSpring BootWeb
- 【workerman】uniapp+thinkPHP5使用GatewayWorker實現實時通訊APPPHPGateway
- 使用Java實現WebSocket通訊JavaWeb
- Python中使用共享變數+訊號量實現程序間的實時通訊Python變數
- 在Spring Boot中實現WebSocket實時通訊Spring BootWeb
- iOS基於Socket.io即時通訊IM實現,WebRTC實現視訊通話iOSWeb
- xmpp實現的即時通訊聊天(一)
- xmpp實現的即時通訊聊天(二)
- 即時通訊中音影片同步的實現
- laravel整合workerman實現websocket多端及時通訊LaravelWeb
- flutter 呼叫環信sdk 實現即時通訊Flutter
- 使用 NSProxy 實現訊息轉發
- 網路通訊2:TCP通訊實現TCP
- 使用AIDL實現程式間的通訊AI
- 匿名管道通訊實現
- java實現UDP通訊JavaUDP
- 魔方實時通訊im元件元件
- 實時通訊技術大亂鬥
- 基於環信實現實時視訊語音通話功能
- 實現在安卓平臺下的即時通訊安卓
- Java Websocket實現即時通訊功能入門教程JavaWeb
- 實現類似QQ的即時通訊程式(十一)
- 在vue中使用SockJS實現webSocket通訊VueJSWeb
- ros中使用serial包實現串列埠通訊ROS串列埠
- QT使用 http 協議通訊的實現示例QTHTTP協議
- 基於 socket.io 快速實現一個實時通訊應用
- 【SignalR全套系列】之在.Net Core 中實現SignalR實時通訊SignalR
- golang實現子程式通訊Golang
- Java實現TCP通訊程式JavaTCP
- angular + express 實現websocket通訊AngularExpressWeb
- 利用SQL實現通訊錄SQL
- 呼叫通訊錄實現思路
- WebRTC---網路實時通訊Web
- WEB 即時通訊最佳實踐Web
- 通過video實現視訊暫停時出現圖片IDE