傳統 Web Server 僅服務靜態 HTML 檔案,內容更新需人工替換檔案。隨著業務需求即時性、互動性增強,必須將資料庫技術與 Web 整合,實現動態內容生成。Oracle 8/8i 提供的 Oracle WebServer (OWS) 結合 PL/SQL Cartridge,提供無需 Java/CGI 即可構建動態 Web 應用的原生方案。
Web Browser ←→ Internet ←→ Web Server (OWS) ←→ PL/SQL Cartridge ←→ Oracle DB Server
| 套件 | 用途 |
|---|---|
| HTP / HTF | Hypertext Procedures/Functions:程式化產生 HTML 標籤 (`HTP.PRINT`, `HTF.ANCHOR` 等)。 |
| OWA_UTIL | Web Agent Utility:取得 CGI 環境變數、重導向、日期格式化、簽章驗證。 |
| OWA_COOKIE | Cookie 讀寫管理。 |
| OWA_PATTERN | 正規表達式字串處理。 |
CREATE OR REPLACE PROCEDURE show_emp_sal (p_empno IN NUMBER) AS
v_ename VARCHAR2(20);
v_sal NUMBER;
BEGIN
SELECT ename, sal INTO v_ename, v_sal FROM emp WHERE empno = p_empno;
-- 產生 HTTP 標頭與 HTML
OWA_UTIL.MIME_HEADER('text/html');
HTP.HTMLOPEN;
HTP.HEADOPEN;
HTP.TITLE('員工薪資查詢');
HTP.HEADCLOSE;
HTP.BODYOPEN;
HTP.HEADER(2, '查詢結果');
HTP.TABLEOPEN(BORDER => 1);
HTP.TABLEROWOPEN;
HTP.TABLEHEADER('員工編號'); HTP.TABLEHEADER('姓名'); HTP.TABLEHEADER('薪資');
HTP.TABLEROWCLOSE;
HTP.TABLEROWOPEN;
HTP.TABLEDATA(p_empno); HTP.TABLEDATA(v_ename); HTP.TABLEDATA(TO_CHAR(v_sal,'L999,999'));
HTP.TABLEROWCLOSE;
HTP.TABLECLOSE;
HTP.BODYCLOSE;
HTP.HTMLCLOSE;
EXCEPTION
WHEN NO_DATA_FOUND THEN
HTP.PRINT('查無此員工編號: ' || p_empno);
END;
/
透過 URL 呼叫:`https://host:port/pls/dad/show_emp_sal?p_empno=7369` (需配置 DAD - Database Access Descriptor)。
| 優點 | 缺點/限制 |
|---|---|
| 開發部署簡單,PL/SQL 開發者即可上手 | 業務邏輯與表現層耦合,難以維護複雜 UI |
| 零客戶端部署,資料庫原生效能 | 佔用資料庫 Session/Process,高併發擴展受限 |
| 安全性集中於資料庫層 | HTML 生成程式碼冗長,缺乏現代框架支援 (MVC、AJAX、模板引擎) |
演進:Oracle 9iAS / 10gAS 引入 J2EE 容器 (OC4J/WebLogic),推薦採用 Java/JSP/Servlet 或 APEX (Application Express) 取代傳統 PL/SQL Web 開發。APEX 以 Declarative 低代碼方式延續 PL/SQL 優勢,並提供現代化 UI 元件、REST API、響應式設計。
Oracle WebServer + PL/SQL 是早期「資料庫即應用伺服器」架構的經典實踐。雖已非主流新建專案選擇,但理解其原理有助於維護舊系統、掌握 APEX 內部運作、以及在資料庫層實現輕量級 HTTP 服務 (如 REST Data Services / ORDS)。