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

Oracle WebServer + PL/SQL HTP/HTF 套件構建動態 Web 應用實戰:從存儲過程生成 HTML 到表單交互

     編輯:Oracle 資料庫基礎

架構模式

瀏覽器 ←→ Internet ←→ Oracle WebServer (iAS/OC4J) ←→ PL/SQL Gateway (mod_plsql/OWA) ←→ Oracle Database

中間件管理連接池、會話狀態、HTTP 協議轉換,PL/SQL 過程直接生成 HTML 響應。

核心內置包

  • HTP (HyperText Procedures):過程式輸出 HTML 標籤(HTP.P, HTP.TABLEOPEN...)。
  • HTF (HyperText Functions):函數式返回 HTML 字符串(HTF.FORMTEXT, HTF.ANCHOR...)。
  • OWA_UTIL:工具包(獲取 CGI 環境、重定向、日期格式化等)。

實例:動態學生成績查詢

1. 成績查詢過程(生成結果頁)

CREATE OR REPLACE PROCEDURE score_into_webpage (code_in IN NUMBER) AS
  CURSOR score_cursor IS
    SELECT code, name, score FROM student WHERE code = code_in;
BEGIN
  HTP.HTMLOPEN;
  HTP.HEADOPEN;
  HTP.TITLE('Student Score Information');
  HTP.HEADCLOSE;
  HTP.BODYOPEN(HTP.CATTRIBUTES => 'BGCOLOR="#808000"');
  HTP.TABLEOPEN(HTP.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_cursor 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 score_into_webpage;
/
-- 授權公開訪問
GRANT EXECUTE ON score_into_webpage TO PUBLIC;

2. 輸入表單過程(生成查詢頁)

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(' ');
  HTP.FORMOPEN('score_into_webpage', HTP.CMETHOD => 'GET');
  HTP.TABLEOPEN(HTP.CATTRIBUTES => 'BORDER="1"');
  HTP.TABLEROWOPEN;
  HTP.TABLEDATA('Enter Student Code');
  HTP.TABLEDATA(HTF.FORMTEXT('code_in', 5, 5));  -- name=code_in 對應參數
  HTP.TABLEROWCLOSE;
  HTP.TABLEROWOPEN;
  HTP.TABLEDATA(HTF.FORMSUBMIT);  -- 提交按鈕
  HTP.TABLEDATA(HTF.FORMRESET);   -- 重置按鈕
  HTP.TABLEROWCLOSE;
  HTP.FORMCLOSE;
  HTP.BODYCLOSE;
  HTP.HTMLCLOSE;
END ScoreForm;
/
GRANT EXECUTE ON ScoreForm TO PUBLIC;

部署與訪問

  1. 配置 mod_plsql (Apache) 或 ORDS (REST Data Services) 映射 DAD (Database Access Descriptor)。
  2. 訪問 URL:https://host:port/pls/DAD/ScoreForm → 顯示輸入表單。
  3. 輸入學號提交 → 調用 score_into_webpage?code_in=123 → 顯示成績表格。

現代化替代方案

Oracle 推薦使用 Oracle REST Data Services (ORDS) + Oracle APEX 或 PL/SQL REST API 替代傳統 mod_plsql:

  • ORDS 自動將 PL/SQL 過程發布為 REST 端點(JSON 輸出)。
  • APEX 提供低代碼可視化開發,底層同樣基於 PL/SQL + HTP。
  • 前後端分離架構:PL/SQL 負責業務邏輯 + JSON API,前端用 React/Vue/Angular 渲染。

安全注意事項

  • 嚴格控制 GRANT EXECUTE TO PUBLIC,生產環境應建立專用 WEB_USER 角色授權。
  • 輸入參數綁定變量防注入(此處參數直接拼接 SQL 有風險,應用 DBMS_ASSERT.ENQUOTE_LITERAL 或改用靜態游標)。
  • 啟用 OWA_UTIL.SIGNATURE 或自定義簽名驗證防 CSRF。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved