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

Oracle 動態 Web 開發實戰:PL/SQL Web Toolkit (HTP/HTF) 構建資料庫驅動網頁

     編輯:Oracle 資料庫基礎

前言

Oracle 8/8i/9i 內建 PL/SQL Web Toolkit (OWA)、HTTP Server (Apache) 與 mod_plsql,提供「資料庫即應用伺服器」的輕量級動態 Web 開發模式。本文以「學生成績查詢」為例,完整示範從 PL/SQL 存儲程序產生 HTML 表單、接收參數、查詢資料庫、動態輸出結果表格的端到端實作。

架構總覽

Browser → HTTP Request → Web Server (Oracle HTTP Server / Apache)
                                    ↓ mod_plsql / OWA
                              Database Server (PL/SQL Procedure)
                                    ↓ HTP/HTF Packages
                              Dynamic HTML Response → Browser

核心套件:HTP (Hypertext Procedures) / HTF (Hypertext Functions)

  • HTP:程序式輸出 HTML 標籤 (如 HTP.PRINT、HTP.TABLEOPEN)
  • HTF:函數式回傳 HTML 字串 (如 HTF.FORMTEXT、HTF.FORMSUBMIT)
  • 常用:HTP.HTMLOPEN/CLOSE, HEADOPEN/CLOSE, TITLE, BODYOPEN/CLOSE, TABLE*, FORM*, HEADER, P, PRINT

實作範例:學生成績查詢系統

1. 資料表結構

CREATE TABLE student (
  code   NUMBER PRIMARY KEY,
  name   VARCHAR2(50),
  score  NUMBER(5,2)
);

2. 核心查詢程序:輸出成績表格

CREATE OR REPLACE PROCEDURE score_into_webpage (code_in IN NUMBER) AS
  CURSOR score_cur IS
    SELECT code, name, score
    FROM student
    WHERE code = code_in;
BEGIN
  -- HTML 頁面骨架
  HTP.HTMLOPEN;
  HTP.HEADOPEN;
  HTP.TITLE('Student Score Information');
  HTP.HEADCLOSE;
  HTP.BODYOPEN(cattributes => 'bgcolor="#808000"');
  HTP.TABLEOPEN(cattributes => 'border="1"');
  HTP.TABLECAPTION('Score Information', 'center');
  
  -- 表頭
  HTP.TABLEROWOPEN;
  HTP.TABLEHEADER('Student Code');
  HTP.TABLEHEADER('Student Name');
  HTP.TABLEHEADER('Student Score');
  HTP.TABLEROWCLOSE;
  
  -- 動態資料列
  FOR score_rec IN score_cur LOOP
    HTP.TABLEROWOPEN;
    HTP.TABLEDATA(score_rec.code);
    HTP.TABLEDATA(score_rec.name);
    HTP.TABLEDATA(score_rec.score);
    HTP.TABLEROWCLOSE;
  END LOOP;
  
  HTP.TABLECLOSE;
  HTP.BODYCLOSE;
  HTP.HTMLCLOSE;
END;

3. 輸入表單程序

CREATE OR REPLACE PROCEDURE ScoreForm AS
BEGIN
  HTP.HEADOPEN;
  HTP.TITLE('Code Entry Form');
  HTP.HEADCLOSE;
  HTP.BODYOPEN;
  HTP.HEADER(2, 'Score Information Code Form');
  HTP.P(' ');
  
  -- 表單導向 score_into_webpage,GET 方法
  HTP.FORMOPEN('score_into_webpage', cmethod => 'GET');
  HTP.TABLEOPEN(cattributes => 'border="1"');
  HTP.TABLEROWOPEN;
  HTP.TABLEDATA('Enter Student Code');
  -- 輸入框名稱必須對應參數 code_in
  HTP.TABLEDATA(HTF.FORMTEXT('code_in', 5, 5));
  HTP.TABLEROWCLOSE;
  HTP.TABLEROWOPEN;
  HTP.TABLEDATA(HTF.FORMSUBMIT);
  HTP.TABLEDATA(HTF.FORMRESET);
  HTP.TABLEROWCLOSE;
  HTP.FORMCLOSE;
  HTP.BODYCLOSE;
  HTP.HTMLCLOSE;
END;

4. 部署與存取

  1. 編譯程序於資料庫 (Schema 需 EXECUTE 權限)
  2. 配置 mod_plsql DAD (Database Access Descriptor) 指向該 Schema
  3. URL 存取:https://host:port/pls/dad/ScoreForm
  4. 輸入學號 → 提交 → 呼叫 score_into_webpage?code_in=123 → 顯示結果

進階技巧與最佳實務

1. 使用 OWA_UTIL 套件增強功能

  • OWA_UTIL.MIME_HEADER:設定 Content-Type (JSON、XML、CSV)
  • OWA_UTIL.REDIRECT_URL:HTTP 重導向
  • OWA_UTIL.GET_CGI_ENV:取得 HTTP 環境變數 (USER_AGENT, REMOTE_ADDR)
  • OWA_UTIL.TABLEPRINT:一鍵將游標/查詢輸出為 HTML 表格

2. 參數驗證與防注入

-- 參數型別由 mod_plsql 自動轉換,但需業務驗證
IF code_in IS NULL OR code_in <= 0 THEN
  HTP.PRINT('

請輸入有效學號

'); RETURN; END IF;

3. 樣式分離:CSS 類別而非內嵌屬性

HTP.BODYOPEN(cattributes => 'class="score-page"');
HTP.TABLEOPEN(cattributes => 'class="data-table"');
-- CSS 由靜態檔案提供,或 HTP.PRINT('')

4. 分頁查詢大量資料

-- 使用 ROWNUM 分頁 (Oracle 12c+ 可用 OFFSET/FETCH)
SELECT * FROM (
  SELECT a.*, ROWNUM rn FROM (
    SELECT code, name, score FROM student WHERE code > :min_code ORDER BY code
  ) a WHERE ROWNUM <= :page_size
) WHERE rn > :offset;

5. 錯誤處理與使用者友善訊息

EXCEPTION
  WHEN NO_DATA_FOUND THEN
    HTP.PRINT('

查無此學號資料

'); WHEN OTHERS THEN HTP.PRINT('

系統暫時無法服務,請稍後再試

'); -- 記錄錯誤日誌 INSERT INTO error_log (proc_name, err_code, err_msg, ts) VALUES ('score_into_webpage', SQLCODE, SQLERRM, SYSTIMESTAMP); END;

現代化演進建議

時代技術棧特點
9i/10gmod_plsql + HTP/HTF資料庫內產生 HTML,簡單報表適用
11g/12cOracle APEX低代碼開發框架,元資料驅動,標準化 UI
18c/19c/21cORDS (Oracle REST Data Services) + JSONREST API 模式,前後端分離,支援微服務
現代ORDS + APEX / JavaScript Framework資料庫暴露 API,前端 React/Vue/Angular 渲染

結語

PL/SQL Web Toolkit (HTP/HTF) 是 Oracle 獨有的「資料庫原生 Web 開發」能力,對於簡單查詢報表、內部管理工具、快速原型極具效率。但隨著前後端分離成為主流,現代架構建議:資料庫專注暴露 REST API (ORDS),前端由專業框架渲染。若維護既有 HTP/HTF 系統,請遵循:參數驗證、錯誤處理、CSS 分離、XSS 防護、日誌審計,並在新開發中採用 APEX/ORDS 路線,實現平滑演進。

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