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

Oracle 的雙重面向:集合思維與物件導向特性的融合

     編輯:Oracle 教學

Oracle 的雙重面向:集合思維與物件導向特性的融合

SQL 本質上是面向集合的宣告式語言,但 Oracle 在長期演進中大量吸收了面向物件的設計思想。這並非矛盾,而是為了讓開發者以更直觀、更高效的方式處理複雜業務。本文從游標、套件、集合操作三個維度,剖析 Oracle 如何在集合基因中融入物件導向基因。

一、游標:集合上的「迭代器」模式

游標是處理結果集的指標,其 FOR ... IN 語法極類似 C# foreach 或 Java 增強 for 迴圈:

BEGIN
  FOR student IN (SELECT sid, name, age, hobby FROM my_test) LOOP
    DBMS_OUTPUT.PUT_LINE('學號:' || student.sid || ' 姓名:' || student.name);
  END LOOP;
END;
  • student 隱性宣告為 cursor%ROWTYPE 記錄型別,直接以 student.sid 存取屬性 —— 這是典型的物件屬性存取語法。
  • 游標封裝了「開啟→抓取→關閉」的資源管理生命週期,符合 RAII(資源獲取即初始化)原則。
  • 參數化游標 CURSOR c(p_deptno NUMBER) IS SELECT ... WHERE deptno=p_deptno 相當於帶參數的迭代器工廠方法。

二、套件:命名空間與封裝的「類」機制

Oracle 套件由 規格**與**主體** 組成,完美對應介面與實現分離:

-- 規格(公開介面)
CREATE OR REPLACE PACKAGE pkg_emp AS
  FUNCTION get_annual_sal(p_empno NUMBER) RETURN NUMBER;
  PROCEDURE raise_sal(p_empno NUMBER, p_pct NUMBER);
END pkg_emp;

-- 主體(實現細節)
CREATE OR REPLACE PACKAGE BODY pkg_emp AS
  FUNCTION get_annual_sal(p_empno NUMBER) RETURN NUMBER IS
    v_sal emp.sal%TYPE;
  BEGIN
    SELECT sal INTO v_sal FROM emp WHERE empno = p_empno;
    RETURN v_sal * 12;
  END;
  -- ...
END pkg_emp;
  • 封裝性:私有變數/子程式僅在 BODY 可見,規格只暴露 API。
  • 狀態保持:套件級變數在 Session 存活期內保持狀態,類似單例模式。
  • 命名空間隔離:pkg_emp.get_annual_sal 避免名稱衝突。
  • 內建套件如 DBMS_OUTPUT、UTL_FILE、DBMS_SCHEDULER 皆是此模式的標準實踐。

三、集合型別:將集合思維「物件化」

Oracle 提供三種集合型別,讓集合操作具備強型別、物件化特徵:

-- 定義巢狀表型別並用於欄位
CREATE TYPE num_tab_t AS TABLE OF NUMBER;
CREATE TABLE dept_stats (deptno NUMBER, sal_list num_tab_t)
  NESTED TABLE sal_list STORE AS sal_list_nt;

-- 多集合運算(SQL 層面的集合代數)
SELECT CAST(MULTISET(SELECT sal FROM emp WHERE deptno=10) AS num_tab_t)
  MULTISET UNION
  CAST(MULTISET(SELECT sal FROM emp WHERE deptno=20) AS num_tab_t)
FROM dual;

四、物件關聯特性(OR 型別)

Oracle 更支援完整的使用者定義型別(UDT):

  • 物件型別:CREATE TYPE addr_t AS OBJECT (city VARCHAR2(50), zip VARCHAR2(10))
  • 繼承/多型:CREATE TYPE emp_t UNDER person_t (...)
  • 方法:MEMBER FUNCTION、STATIC FUNCTION、CONSTRUCTOR FUNCTION
  • REF 引用:物件間導航,支援 DEREF。

這使得 Oracle 能在關聯表格之上建立豐富領域模型,但實務中純關聯模型 + PL/SQL 封裝仍是主流,OR 特性多用於 GIS、XML、複雜文檔等領域。

五、面向集合 vs 面向物件:何時用哪種?

型別特性對應概念典型用法
關聯陣列稀疏、任意索引(負數/字串)、僅 PL/SQL 可用Map/Dictionary快取、查找表
巢狀表可存資料庫、支援多集合運算(MULTISET UNION/INTERSECT/EXCEPT)List/Set表欄位、批量綁定
VARRAY固定長度、有序、儲存內嵌Array小型固定集合(如電話清單)
場景推薦風格理由
大量資料集合運算(篩選、聚合、連結)面向集合SQL 引擎優化、平行執行、向量化處理
複雜業務流程、狀態機、多步驟驗證面向物件封裝邏輯、單元測試、減少 Context Switch
批量資料載入/轉換 (ETL)集合 + 批量綁定FORALL、BULK COLLECT 減少 SQL/PL/SQL 切換
階層式/遞迴資料處理混合SQL CONNECT BY/WITH RECURSIVE + PL/SQL 封裝

總結

Oracle 的偉大在於不強迫你二選一。核心引擎是集合論與關聯代數的極致實踐,同時提供物件導向的語法糖與擴展機制,讓開發者能在「宣告式集合操作」與「命令式物件邏輯」間自由切換。真正的專家,是懂得在 SQL 層面用集合思維解決 80% 問題,在 PL/SQL 層面用物件思維管控剩餘 20% 複雜度的人。

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