Oracle 8i 起支援物件導向特性:封裝性 (介面與實作分離)、繼承性 (擴充性)、多型性 (同一操作不同實作)。本文說明 Oracle 物件型別定義、實例化與資料庫儲存兩大模式。
CREATE OR REPLACE TYPE empObj AS OBJECT (
emp_id NUMBER(5),
emp_name VARCHAR2(20),
emp_salary NUMBER(4),
-- 成員函數宣告
MEMBER FUNCTION addsalary(ext_salary NUMBER) RETURN VARCHAR2
);
/
CREATE OR REPLACE TYPE BODY empObj AS
MEMBER FUNCTION addsalary(ext_salary NUMBER) RETURN VARCHAR2 IS
BEGIN
emp_salary := emp_salary + ext_salary;
RETURN TO_CHAR(emp_salary);
END addsalary;
END;
/
若無成員函數,僅需規範部分。
DECLARE
v_empObj1 empObj;
BEGIN
-- 建構函數初始化 (無成員函數時可用)
v_empObj1 := empObj(10005, 'Jack', 6500);
-- 存取屬性
DBMS_OUTPUT.PUT_LINE('ID: ' || v_empObj1.emp_id);
-- 呼叫方法
DBMS_OUTPUT.PUT_LINE('New Salary: ' || v_empObj1.addsalary(300));
END;
/
PL/SQL 區塊中宣告的物件為暫時性,超出作用域即釋放。持久化需儲存於資料庫:
表欄位直接使用物件型別:
CREATE TABLE table1 (
id NUMBER(2),
emp empObj
);
每個欄位對應物件屬性,每列即一物件實例:
CREATE TABLE emp_obj_table (
emp_id NUMBER(5),
emp_name VARCHAR2(20),
emp_salary NUMBER(4)
);
INSERT INTO emp_obj_table VALUES (empObj(10006, 'Mary', 5000));
注意:物件表儲存忽略成員函數資訊;欄位型態須與物件屬性一一對應。
Oracle 物件導向能力將資料與行為封裝,支援繼承與多型,適合複雜領域建模。理解型別定義兩階段、實例化方式與兩種持久化模式,是運用 OO 特性的關鍵基礎。