首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle PL/SQL 呼叫外部 C 程序與 COM 物件完整實作:從監聽器配置到 Excel 自動化範例

     編輯:Oracle 資料庫基礎

PL/SQL 雖強,但在作業系統資源存取、高效運算、硬體裝置控制、網路應用等面向不如 C/Java。Oracle 8 起支援外部程序,讓 PL/SQL 透過監聽器啟動 extproc 進程,動態載入 DLL 呼叫 C 函數;9i 更引入 Java。本文完整演示:監聽器/Net 服務配置 → 外部函數映射 → COM 介面封裝 → Excel 自動化實戰。

架構原理

  1. PL/SQL 呼叫外部函數
  2. 監聽器接收 IPC 請求,啟動 extproc 進程
  3. extproc 動態載入指定 DLL(共享庫)
  4. DLL 執行 C 函數,結果經 extproc 回傳 PL/SQL
  5. Session 結束或資料庫關閉,extproc 自動退出

環境規格

  • Oracle 9i + Windows 2000
  • ORACLE_HOME=D:\Oracle\ora92, SID=ORADB, HOST=CHANET

1. 監聽器配置

編輯 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

2. Net 服務配置

編輯 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 版本

3. 建立 COM 封裝套件

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 封裝腳本

4. 監聽器參數微調

STARTUP_WAIT_TIME_LISTENER = 0
CONNECT_TIMEOUT_LISTENER = 10
TRACE_LEVEL_LISTENER = OFF
PASSWORDS_LISTENER = (Oracle)

5. PL/SQL ↔ COM 資料型別對照

PL/SQLCOM API
VARCHAR2BSTR
BOOLEANBOOL
BINARY_INTEGERBYTE, INT, LONG
DOUBLE PRECISIONDOUBLE, FLOAT, CURRENCY
DATEDATE

6. COM 核心函數速查

7. 實戰:PL/SQL 匯出資料至 Excel

目標:將資料表記錄輸出為 Excel 檔案,操作單元格字型、大小、值。

Excel 物件模型鏈:

  1. Application (程式句柄)
  2. Workbooks (工作簿集合) → Workbook
  3. Worksheets (工作表集合) → Worksheet
  4. Range (區域/儲存格)
  5. Font (字型)
  6. Size (大小屬性)

對應 COM 呼叫鏈:

-- 1. 建立 Excel Application
obj_app := CreateObject('Excel.Application');

-- 2. 取得/新增 Workbook
obj_wb := Invoke(obj_app, 'Workbooks.Add');

-- 3. 取得 Worksheet
obj_ws := GetProperty(obj_wb, 'Worksheets', 1);

-- 4. 取得 Range (A1)
obj_range := GetProperty(obj_ws, 'Range', 'A1');

-- 5. 取得 Font 物件
obj_font := GetProperty(obj_range, 'Font');

-- 6. 設定 Size = 20
SetProperty(obj_font, 'Size', 20);

-- 寫入資料迴圈
FOR rec IN (SELECT * FROM my_table) LOOP
  obj_cell := GetProperty(obj_ws, 'Cells', row_num, col_num);
  SetProperty(obj_cell, 'Value', rec.col_value);
END LOOP;

-- 存檔
Invoke(obj_wb, 'SaveAs', 'C:\export.xls');

-- 清理
DestroyObject(obj_wb);
DestroyObject(obj_app);

除錯建議

  • 物件瀏覽器:Excel VBA 編輯器 → 檢視 → 物件瀏覽器,查詢屬性/方法簽名
  • 每步 GetLastError 檢查 HRESULT
  • 記得 DestroyObject 釋放 COM 參考計數,否則 Excel 進程殘留
  • 安全性:DLL 必須在 $ORACLE_HOME/bin 或 PATH 可見路徑

結語

外部程序打通了 PL/SQL 與作業系統生態的牆壁。監聽器 IPC 配置 → extproc → DLL → COM 四環扣一環,缺一不可。Excel 自動化只是冰山一角;同樣架構可整合 Outlook 郵件、Word 報表、ADSI 目錄、硬體感測器、專有演算法庫,將 Oracle 變為企業整合中樞。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
函數功能
CreateObject建立 COM 物件
DestroyObject釋放物件
GetProperty取得屬性值
SetProperty設定屬性值
InitArg / SetArg準備方法參數
Invoke呼叫方法/程序
InitOutArg / GetArg取得輸出參數/傳回值
GetLastError取得錯誤資訊