Oracle Reports 若需在報表中提供 CSV/Excel 下載連結,可透過 Format Trigger 動態產生超連結 URL,配合自訂 Package 組裝檔案內容。
EXP_FILE:處理檔案建立、寫入、URL 組裝。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;
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 可存取目錄
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;
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 也能優雅提供下載功能。