Oracle 缺乏即時訊息輸出工具,開發人員常依賴 DBMS_OUTPUT.PUT_LINE,但該函數需等程序結束才回傳結果,無法即時監控長時間批次作業。本文示範如何封裝 UTL_SMTP 套件,從 Oracle 8i 直接發送 Email,實現即時通知與除錯。
plsql.jar 至資料庫,否則呼叫 API 會拋出 ORA-29540: class oracle/plsql/net/TCPConnection does not exist。載入指令:
loadjava -user sys/password@database -resolve plsql/jlib/plsql.jar
或以 SYS 執行 $ORACLE_HOME/RDBMS/ADMIN/initplsj.sql。
OPEN_CONNECTION:建立 SMTP 連線 (預設埠 25);HELO:識別發送端身分;MAIL:初始化郵件交易;RCPT:指定收件者 (多位收件者需重複呼叫);DATA:傳送郵件內容 (含標頭與主旨);QUIT:結束會話並斷開連線。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 DEFAULT NULL,
pSubject IN VARCHAR2 DEFAULT NULL,
pMessage IN VARCHAR2 DEFAULT NULL
);
END EmailUtils;
/
Send 為多載程序,支援預設參數與完整參數兩種呼叫方式,靈活適應不同場景。
透過 UTL_SMTP 封裝即時通訊機制,打破傳統 DBMS_OUTPUT 的限制,讓 DBA 與開發人員能即時掌握長時間程序執行狀態,大幅提升運維效率。