首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle Reports 嵌入下載超連結實作教學

     編輯:Oracle 資料庫相關知識

Oracle Reports 若需在報表中提供 CSV/Excel 下載連結,可透過 Format Trigger 動態產生超連結 URL,配合自訂 Package 組裝檔案內容。

核心元件

  1. Layout 欄位:放置文字方塊 (如「Download」),設定 Format Trigger。
  2. Package EXP_FILE:處理檔案建立、寫入、URL 組裝。
  3. Before Report Trigger:報表跑資料階段寫入檔案內容。

完整程式碼

1. Layout 欄位 Format Trigger

FUNCTION B_13FormatTrigger RETURN BOOLEAN IS
BEGIN
  IF UPPER(:P_ACTION) != 'DOWNLOAD' THEN
    RETURN FALSE;  -- 非下載模式隱藏連結
  ELSE
    SRW.SET_HYPERLINK(EXP_FILE.LINKTO);  -- 設定超連結 URL
    RETURN TRUE;
  END IF;
END;

2. Package EXP_FILE 規格與主體

CREATE OR REPLACE PACKAGE EXP_FILE IS
  FUNCTION LINKTO RETURN VARCHAR2;
  FUNCTION MAKE(p_filename VARCHAR2, p_userid VARCHAR2, p_ext VARCHAR2, p_overwrite BOOLEAN) RETURN BOOLEAN;
  PROCEDURE APPEND(p_line VARCHAR2);
END;
/

CREATE OR REPLACE PACKAGE BODY EXP_FILE IS
  g_file UTL_FILE.FILE_TYPE;
  g_url  VARCHAR2(4000);

  FUNCTION LINKTO RETURN VARCHAR2 IS
  BEGIN
    RETURN :P_URL || g_filename;  -- 組裝完整下載 URL
  END;

  FUNCTION MAKE(...) RETURN BOOLEAN IS
  BEGIN
    g_file := UTL_FILE.FOPEN('REPORTS_OUTPUT_DIR', p_filename || '.' || p_ext, 'W');
    g_filename := p_filename;
    RETURN TRUE;
  END;

  PROCEDURE APPEND(p_line VARCHAR2) IS
  BEGIN
    UTL_FILE.PUT_LINE(g_file, p_line);
  END;
END;
/
-- 注意:需建立 DIRECTORY 物件 REPORTS_OUTPUT_DIR 指向 Web 可存取目錄

3. Before Report Trigger 產生檔案內容

FUNCTION BeforeReport RETURN BOOLEAN IS
BEGIN
  IF UPPER(:P_ACTION) = 'DOWNLOAD' THEN
    :P_SESSION := USERENV('SESSIONID');
    EXP_FILE.MAKE('Vendor_Item_Ref_' || TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS'),
                  :P_USERID, 'csv', FALSE);
    
    -- 寫入標題區
    EXP_FILE.APPEND('||||Vendor Item Reference Enquiry||||||||||||||||');
    EXP_FILE.APPEND('Selection criteria||CCN:||' || :P_CCN || '||Mas Loc:||' || :P_MASLOC);
    EXP_FILE.APPEND('Dept*|Vendor|Pur Loc|Item|Make|Description|Env. Std.|Env. Status');
    
    -- 此處可迴圈查詢游標寫入明細行
  END IF;
  RETURN TRUE;
END;

關鍵設定

  • Reports Server 需配置 webRoot 對應 UTL_FILE 目錄,使產生的 CSV 可透過 HTTP 下載。
  • :P_ACTION 參數由前端傳入 (如 https://host/reports/rwservlet?report=xxx&action=DOWNLOAD)。
  • 大量資料建議分批 UTL_FILE.PUT 並定期 FFLUSH,避免記憶體壓力。

現代化替代方案

Oracle APEX / ORDS REST API + 前端 DataTables/ExcelJS 可完全取代 Reports 下載功能,維護性更高。

掌握 Format Trigger + UTL_FILE 模式,舊版 Reports 也能優雅提供下載功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved