Oracle12C--對象表(66)

  • 簡介
    • 說明: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_objectemp_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 ;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章