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

Oracle Reports 定長定寬報表輸出實戰:Tabular 與 Matrix 兩大風格完美解決方案

     編輯:Oracle 資料庫基礎

業務痛點

Oracle Reports 預設輸出 **行數/列數隨資料動態變化**:Tabular 風格列固定行變,Matrix 風格行列雙變。打印套印、歸檔歸檔、對賬核銷等場景**強制要求每頁固定行數/列數** (如每頁 40 行、每行 10 列)。

方案一:Tabular 風格 — After Parameter Form + After Report 觸發器補齊空行

核心思路

  1. **Before/After Parameter Form**:計算本次查詢總行數,推算最後一頁缺多少行湊齊「每頁固定行數」。
  2. **插入空白記錄** 到基表 (或臨時表),使總行數成為 `頁大小` 的整數倍。
  3. **After Report**:刪除剛插入的空白記錄,還原業務數據。

實戰代碼 (以物資代碼表 WZDM 為例,每頁 X 行)

-- 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;

方案二:Matrix 風格 — 視圖 UNION ALL 補齊空行與空列

核心思路

  1. 建立 **輔助計數表** `T_KJL` (單欄 `NO`,值 1..Z,Z=最大可打印行數)。
  2. 建立 **視圖** `V_TJBB`,將基表 `T_ZJXHQX` 與 `T_KJL` 交叉聯接,利用 `UNION ALL` 補齊:
    • 行不足 → 補空行 (`DWMC` 為實值, `LBMC` 為 NULL, `JE` 為 NULL)。
    • 列不足 → 補空列 (`DWMC` 為 NULL, `LBMC` 為實值, `JE` 為 NULL)。
  3. 報表直接查詢視圖,輸出即為固定 X 行 Y 列。

視圖建立腳本

-- 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 複雜、需維護輔助表、參數化靈活度較低

現代替代方案 (建議)

  • BI 工具 (OBIEE, Tableau, Power BI):原生支援分頁固定行列、導出 PDF/Excel 精準控制。
  • PL/SQL + XML Publisher / APEX:程式化生成 RTF/PDF 模板,精準控制版面。
  • JasperReports / BIRT:開源 Java 報表引擎,程式化佈局。

結語

Oracle Reports 觸發器/視圖補齊方案是 **歷史業務系統維護期的權宜之計**。新專案請直接採用 **現代報表引擎**,將版面邏輯從資料庫層剝離至表現層,實現關注點分離、易維護、易擴展。

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