PL/SQL 雖強,但在作業系統資源存取、高效運算、硬體裝置控制、網路應用等面向不如 C/Java。Oracle 8 起支援外部程序,讓 PL/SQL 透過監聽器啟動 extproc 進程,動態載入 DLL 呼叫 C 函數;9i 更引入 Java。本文完整演示:監聽器/Net 服務配置 → 外部函數映射 → COM 介面封裝 → Excel 自動化實戰。
extproc 進程extproc 動態載入指定 DLL(共享庫)extproc 回傳 PL/SQLextproc 自動退出ORACLE_HOME=D:\Oracle\ora92, SID=ORADB, HOST=CHANET編輯 D:\Oracle\ora92\network\admin\listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = CHANET)(PORT = 1521)))
(ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = extproc1)))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:\Oracle\ora92)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = ORADB)
(ORACLE_HOME = D:\Oracle\ora92)
(SID_NAME = ORADB)
)
)
關鍵:IPC KEY=extproc1、SID_NAME=PLSExtProc、PROGRAM=extproc
編輯 tnsnames.ora
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)))
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
重啟監聽器驗證:
lsnrctl stop
lsnrctl start
tnsping EXTPROC_CONNECTION_DATA -- OK (30ms)
D:\Oracle\ora92\bin> extproc -- 顯示 Heterogeneous Agent 版本
CONN SYSTEM/chanet@ORADB
CREATE USER chanet IDENTIFIED BY chanet;
GRANT CREATE LIBRARY TO chanet;
CONN chanet/chanet@ORADB
@D:\Oracle\ora92\com\comwrap.sql -- Oracle 提供的 COM 封裝腳本
STARTUP_WAIT_TIME_LISTENER = 0
CONNECT_TIMEOUT_LISTENER = 10
TRACE_LEVEL_LISTENER = OFF
PASSWORDS_LISTENER = (Oracle)
| PL/SQL | COM API |
|---|---|
| VARCHAR2 | BSTR |
| BOOLEAN | BOOL |
| BINARY_INTEGER | BYTE, INT, LONG |
| DOUBLE PRECISION | DOUBLE, FLOAT, CURRENCY |
| DATE | DATE |
| 函數 | 功能 |
|---|---|
CreateObject | 建立 COM 物件 |
DestroyObject | 釋放物件 |
GetProperty | 取得屬性值 |
SetProperty | 設定屬性值 |
InitArg / SetArg | 準備方法參數 |
Invoke | 呼叫方法/程序 |
InitOutArg / GetArg | 取得輸出參數/傳回值 |
GetLastError | 取得錯誤資訊 |