Oracle Reports 預設輸出 **行數/列數隨資料動態變化**:Tabular 風格列固定行變,Matrix 風格行列雙變。打印套印、歸檔歸檔、對賬核銷等場景**強制要求每頁固定行數/列數** (如每頁 40 行、每行 10 列)。
-- After Parameter Form Trigger
DECLARE
v_total_rows NUMBER;
v_dummy_rows NUMBER;
i NUMBER := 1;
BEGIN
SELECT COUNT(*) INTO v_total_rows FROM wzdm;
v_dummy_rows := MOD(v_total_rows, :page_size); -- :page_size 為報表參數
IF v_dummy_rows <> 0 THEN
v_dummy_rows := :page_size - v_dummy_rows; -- 補齊數
LOOP
EXIT WHEN i > v_dummy_rows;
INSERT INTO wzdm (wzdm, wzmc, xhgg, jldw) VALUES ('', '', '', '');
i := i + 1;
END LOOP;
COMMIT;
END IF;
END;
-- After Report Trigger
BEGIN
DELETE FROM wzdm WHERE wzdm IS NULL; -- 假設空白行主鍵為 NULL
COMMIT;
END;
-- 1. 輔助計數表
CREATE TABLE t_kjl (no NUMBER(2));
BEGIN
FOR i IN 1..100 LOOP INSERT INTO t_kjl VALUES (i); END LOOP; -- Z=100
COMMIT;
END;
-- 2. 視圖 (每頁 X 行 Y 列)
CREATE OR REPLACE VIEW v_tjbb AS
SELECT dwmc, lbmc, je FROM t_zjxhqx
UNION ALL
-- 補空行:行數不足 X
SELECT dwmc, NULL, TO_NUMBER(NULL)
FROM t_zjxhqx, t_kjl
WHERE no - (100 - :x) > (
SELECT MOD(COUNT(DISTINCT lbmc) - 1, :x) + 1 FROM t_zjxhqx
)
UNION ALL
-- 補空列:列數不足 Y
SELECT NULL, lbmc, TO_NUMBER(NULL)
FROM t_zjxhqx, t_kjl
WHERE no - (100 - :y) > (
SELECT MOD(COUNT(DISTINCT dwmc) - 1, :y) + 1 FROM t_zjxhqx
);
| 風格 | 核心機制 | 優點 | 缺點/注意 |
|---|---|---|---|
| Tabular | 觸發器動態增刪基表空行 | 邏輯簡單、無需額外物件 | 修改基表數據、併發風險、需獨佔報表執行 |
| Matrix | 視圖 UNION ALL 虛擬補齊 | 不動基表、支援行列雙固定、併發安全 | 視圖 SQL 複雜、需維護輔助表、參數化靈活度較低 |
Oracle Reports 觸發器/視圖補齊方案是 **歷史業務系統維護期的權宜之計**。新專案請直接採用 **現代報表引擎**,將版面邏輯從資料庫層剝離至表現層,實現關注點分離、易維護、易擴展。