-
簡介
- 說明:Oracle屬於面向對象的數據庫,所以在Oracle中也允許用戶基於類的結構進行數據表的創建,同時採用類的關係進行表中數據的維護
- 示例1:定義要使用的類結構
-- 刪除emp_object,否則dept_object無法重新建立 DROP TYPE emp_object ; -- 定義部門類 CREATE OR REPLACE TYPE dept_object AS OBJECT ( atri_deptno NUMBER(2) , -- 部門編號 atri_dname VARCHAR2(14) , -- 部門名稱 atri_loc VARCHAR2(13) , -- 部門位置 -- 取得對象信息 MEMBER FUNCTION tostring RETURN VARCHAR2 ) NOT FINAL ; / -- 定義Person類規範 CREATE OR REPLACE TYPE person_object AS OBJECT ( atri_pid NUMBER , -- 人員編號 atri_name VARCHAR2(10) , -- 人員姓名 atri_sex VARCHAR2(10) , -- 人員性別 NOT INSTANTIABLE MEMBER FUNCTION tostring RETURN VARCHAR2 , -- 定義抽象方法 -- 實現對象排序 NOT INSTANTIABLE MAP MEMBER FUNCTION compare RETURN NUMBER ) NOT FINAL NOT INSTANTIABLE ; -- 此處必須使用NOT INSTANTIABLE聲明類 / -- 定義Emp類規範,此類爲Person子類 CREATE OR REPLACE TYPE emp_object UNDER person_object ( atri_job VARCHAR2(9) , -- 僱員職位 atri_sal NUMBER(7,2) , -- 僱員工資 atri_comm NUMBER(7,2) , -- 僱員佣金 atri_dept dept_object , -- 僱員部門 -- 此函數名稱與父類函數名稱一樣,所以此處爲函數的覆寫 OVERRIDING MEMBER FUNCTION tostring RETURN VARCHAR2 , -- 實現對象排序 OVERRIDING MAP MEMBER FUNCTION compare RETURN NUMBER ) ; / -- 定義dept_object類體 CREATE OR REPLACE TYPE BODY dept_object AS MEMBER FUNCTION tostring RETURN VARCHAR2 AS BEGIN RETURN '部門編號:' || SELF.atri_deptno || ',名稱:' || SELF.atri_dname || ',位置:' || SELF.atri_loc ; END ; END ; / -- 定義emp_object類體 CREATE OR REPLACE TYPE BODY emp_object AS OVERRIDING MEMBER FUNCTION tostring RETURN VARCHAR2 AS BEGIN RETURN '人員編號:' || SELF.atri_pid || ',姓名:' || SELF.atri_name || ',性別:' || SELF.atri_sex || '職位:' || SELF.atri_job || ',工資:' || SELF.atri_sal || ',佣金:' || SELF.atri_comm ; END ; OVERRIDING MAP MEMBER FUNCTION compare RETURN NUMBER AS BEGIN RETURN SELF.atri_sal + SELF.atri_comm ; END ; END ; / |
此程序定義了3個類規範,由於person_oobject屬於抽象類,所以只定義了兩個類體; |
|
-
創建對象表
- 當用戶定義完一個類之後,就可以依據此類中的屬性結構創建指定的對象表,語法如下:
CREATE TABLE 表名稱 OF 類; |
在創建對象表時,如果對象表中存在了繼承的操作關係,那麼也會將繼承而來的相應屬性自動變爲數據表中的列 |
-
示例1:創建一個對象表
CREATE TABLE emp_object_tab OF emp_object ; |
- 查看emp_object_tab數據表結構
DESC emp_object_tab ; |
- 通過此時的查詢結果可以發現,atri_dept這個嵌套類型依然會以對象的形式存在,同時emp_object_tab表中包含了person_object和emp_object的所有屬性;
-
維護對象表數據
- 對象表建立完成之後對錶中的數據同樣分爲4類:增加,修改,刪除,查詢
-
數據增加,使用INSERT語句:
-
示例1:增加數據,但是不增加部門屬性數據
-
INSERT INTO emp_object_tab(atri_pid,atri_name,atri_sex,atri_job,atri_sal,atri_comm) VALUES (10,'hey','男','辦事員',3500,100); |
-
示例2:增加數據,同時使用嵌套類型
INSERT INTO emp_object_tab(atri_pid,atri_name,atri_sex,atri_job,atri_sal,atri_comm,atri_dept) VALUES (20,'yy','男','技術員',5500,200, dept_object(10,'開發部','北京')); |
-
數據查詢:
-
示例1:查詢emp_object_tab表中的全部數據
-
SELECT * FROM emp_object_tab ; |
-
在進行對象表數據查詢時,還可以利用VALUE()或REF()函數進行數據的查詢
- VALUE函數:利用此函數可將對象表中的數據轉化爲對象返回,這樣可以利用查詢後的對象信息進行排序
- REF()函數:VALUE()函數可將嵌套的對象信息直接保存在對象表中,這種做法有時會造成數據的冗餘。例如,一個部門會存在多個僱員,每當增加僱員數據時,都需要重複保存部門信息。所以在Oracle中也提供了數據的地址指向,如圖:
-
數據更新,需要考慮對象類型的操作列:
-
示例1:更新emp_object_tab對象表(此表不使用REF引用)中的部門信息
-
UPDATE emp_object_tab SET atri_job='經理' , atri_dept=dept_object(30,'魔樂','加拿大') WHERE atri_pid=10 ; |
接上例:查詢emp_object_tab對象表中修改後的數據
SELECT * FROM emp_object_tab WHERE atri_pid=10 ; |
-
示例2:更新emp_object_ref_tab對象表(此表使用REF引用)中的部門信息
UPDATE emp_object_ref_tab SET atri_dept=( SELECT REF(d) FROM dept_object_ref_tab d WHERE atri_deptno=30) WHERE atri_pid=3020 ; |
-
接上例:查詢emp_object_ref_tab對象表中修改後的數據
SELECT atri_pid,atri_name,atri_sex,atri_job,atri_sal,atri_comm, DEREF(atri_dept) dept FROM emp_object_ref_tab WHERE atri_pid=3020 ; |
-
示例3:除了使用更新對象列之外,還可以取出相應的對象信息設置數據的更新條件
- 更新emp_object_ref_tab對象表中所有10部門僱員信息
UPDATE emp_object_ref_tab SET atri_name='王月清',atri_sal=6000 WHERE atri_dept=(SELECT REF(d) FROM dept_object_ref_tab d WHERE atri_deptno=10) ; |
-
查詢emp_object_ref_tab數據表的數據
SELECT atri_pid,atri_name,atri_sex,atri_job,atri_sal,atri_comm, DEREF(atri_dept) dept FROM emp_object_ref_tab ; |
-
刪除數據,可以按照普通字段或者對象字段進行操作:
-
示例1:刪除emp_object_ref_tab表中10部門的僱員信息
-
DELETE FROM emp_object_ref_tab WHERE atri_dept=(SELECT REF(d) FROM dept_object_ref_tab d WHERE atri_deptno=10) ; |
-
接上例:查詢emp_object_ref_tab數據表的數據
SELECT atri_pid,atri_name,atri_sex,atri_job,atri_sal,atri_comm, DEREF(atri_dept) dept FROM emp_object_ref_tab ; |