Microsoft Excel 憑藉其豐富的格式化功能(字體、多工作表)與廣泛的商業應用普及度,成為資料呈現的首選格式。雖然 Excel 能讀取 CSV 等分隔檔案,但專屬的 .xls 格式能提供更強的表現力。在企業環境中,常需從多個 Oracle 資料庫撈取資料並彙整成單一試算表,以利比對分析。常見情境包括:DBA 比較多庫配置、開發人員核對 PL/SQL 物件版本、資料遷移進度評估、測試與正式環境資料比對等。
本文示範以 Java、JDBC 與 Apache Jakarta POI 開源庫,打造一套可依 XML 設定檔連線多個 Oracle 資料庫、執行同一 SQL 查詢、並將各庫結果分別輸出至同一 Excel 活頁簿的不同工作表的工具程式。核心需求如下:
ServerName-SID開發測試環境:JRE 1.4.2 / Windows 2000。Java 跨平台特性使其可在任何支援相容 JRE 的作業系統上執行。JRE 1.4 內建 XML 處理 API(JAXP),無需額外引入 Xerces、Xalan 等外部庫。
必須在 CLASSPATH 中包含以下兩個核心 JAR:
classes12.jar(通常位於 $ORACLE_HOME/jdbc/lib 或可從 OTN 下載)。缺少時會拋出 ClassNotFoundException: oracle.jdbc.driver.OracleDriver。poi-2.5.1-final-20040804.jar。缺少時會拋出 NoClassDefFoundError: org/apache/poi/hssf/usermodel/HSSFWorkbook。專案提供 run.bat(Windows)與 run.sh(Linux)腳本設定環境變數,並打包成 broadcast.jar 執行。
採用階層式 XML 描述多資料庫連線與單一查詢,範例:
<BROADCAST>
<CONNECTION-CONFIG>
<DATABASE>
<SERVER-NAME>server001</SERVER-NAME>
<PORT>1521</PORT>
<SID>ORCL</SID>
<USERNAME>sysdba</USERNAME>
<PASSWORD>my1manager</PASSWORD>
</DATABASE>
<DATABASE>
<SERVER-NAME>server002</SERVER-NAME>
<PORT>1521</PORT>
<SID>PROD</SID>
<USERNAME>sysdba</USERNAME>
<PASSWORD>my1manager</PASSWORD>
</DATABASE>
</CONNECTION-CONFIG>
<SQL-STATEMENT>select * from v$parameter</SQL-STATEMENT>
</BROADCAST>
XMLConfigVO 類別使用 DocumentBuilderFactory 解析 XML,透過 XPath(//broadcast/connection-config/database、//broadcast/sql-statement)提取節點值,供後續流程使用。
OracleConnectionVO 封裝 JDBC 連線參數:驅動類別 oracle.jdbc.driver.OracleDriver、URL 格式 jdbc:oracle:thin:@<host>:<port>:<SID>。程式逐一建立連線、執行查詢、取得 ResultSet 與 ResultSetMetaData(用於取得欄位名稱與數量)。
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet(sheetName); // sheetName = ServerName-SID
HSSFFont boldFont = wb.createFont();
boldFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
HSSFCellStyle boldStyle = wb.createCellStyle();
boldStyle.setFont(boldFont);
迭代 ResultSetMetaData 寫入標題列並套用 boldStyle;接著逐列讀取 ResultSet,嘗試以 Long 型別寫入儲存格,若擲出 NumberFormatException 則改用 toString() 寫入字串,確保任意資料型別皆能正確輸出。
FileOutputStream out = new FileOutputStream("output.xls");
wb.write(out);
out.close();
將下列查詢置入 config.XML 即可快速產出比對報表:
SELECT * FROM v$databaseSELECT 'Name: '||name FROM v$database UNION ALL SELECT 'DBID: '||dbid FROM v$database UNION ALL SELECT * FROM v$versionSELECT * FROM V$BACKUP_SET 或 V$RMAN_CONFIGURATIONSELECT * FROM APPLSYS.AD_APPLIED_PATCHES ORDER BY PATCH_NAME本工具展示了 Java 生態系成熟 API(JDBC、POI、JAXP)快速構建實用工具的能力。實務部署時可進一步強化:密碼加密、支援 BLOB/CLOB/LONG 型別、提供 GUI 介面、完善錯誤處理與日誌記錄、支援多查詢批次執行等。將多庫資料匯聚於單一 Excel 檔,極大簡化了跨資料庫比對分析的工作流程。