oracle:對象(object)操作


創建對象類型

CREATE TYPE object_type AS OBJECT(
column_name type,
[column_name type,]
[MEMBER FUNCTION fun_name RETURN type]
[MEMBER PROCEDURE proc_name ]
);

 

 其中MEMBER FUNCTION 聲明了對象內部函數,MEMBER PROCEDURE 聲明了內部過程,添加對象體(body)

CREATE TYPE BODY object_type AS
  MEMBER FUNCTION fun_name RETURN type IS
    var_name type;
  BEGIN
    NULL;
  END;
END;
/

 

獲取有關對象類型的信息

DESC[RIBE] object_type;

 

如果對象是嵌套對象,可以通過設定深度來輸出子對象,下面是輸出兩級的。

SET DESCRIBE DEPTH 2
DESC[RIBE] object_type;

 

 使用對象類型定義列和對象表

CREATE TABLE table_name(
column_name type,
column_name1 object_type
);

 

 上面的 object_type 是通過之前的對象類型定義而來的。

CREATE TABLE object_tab_name OF object_type;

 上面定義的表跟普通的創建表沒有太大的分別(可能)。

 

對象引用和對象標示符

對象表的另一一個不同之處在於可以使用對象引用(object reference)為對象表之間的關系建立模型,而不使用外鍵達到外鍵的效果。

 使用REF類型進行定義,通常用作指向對象表中對象的指針。

CREATE TABLE table_name(
column_name type,
obj_col_name REF object_type SCOPE IS obj_tab_name);

 如果 obj_tab_name 表已經存在,則可以不寫 SCOPE IS obj_tab_name

注意:obj_tab_name 是用 object_type 創建的對象表

 

向包含對象屬性的表插入數據

INSERT INTO table_name(
column_name, obj_col_name)
VALUES(
'xx',object_type('xx','xx','xx) );

or

INSERT INTO table_name(
column_name,obj_col_name)
VALUES(
x,
(SELECT REF(T) FROM obj_tab_name T WHERE T.col=x) );

 

下面那個是通過直接插入標識符,數據已經存在了對象表obj_tab_name 中,REF() 是獲得對象的標識符,

 

查找數據的時候,object_tpye 中的全部數據會合成一個數據輸出,就是列名下面是很長的一個下划線,沒有斷開

要用對象中的某個屬性作為查找條件

SELECT *
FROM table_name T
WHERE T.obj_col_name.column_name= xx;

 

對對象表的DML操作

插入數據

INSERT INTO obj_tab_name VALUES(
object_type(x,xx,xxx,xxxx));

INSERT INTO object_tab_name 
(column_name1,column_name2)
VALUES(
x,xx);

兩種方法一樣的。

從對象表中選擇數據

SELECT *
FROM obj_tab_name;

 

這樣得出的結果跟普通表一樣,每個列分開。

SELECT VALUE(T)
FROM obj_tab_name T;

 

這樣得出的結果跟查找包含對象類型的表,的查找結果一樣,全部數據合並成一樣。

 

類型繼承 NOT FINAL

CREATE TYPE obj_par_name AS OBJECT(
column_name type
)NOT FINAL;

 

CREATE TYPE obj_chi_name UNDER obj_par_name(
column_name1 type
);

 

NOT INSTANTIABLE對象類型

可以防止創建該類型的對象實例。

CREATE TYPE object_name AS OBJECT(
column_name type
)NOT FINAL NOT INSTANTIABLE;

 

 NOT INSTANTIABLE 對象不能為 FINAL, 所以和NOT FINAL 一起用。

 自定義構造函數

CREATE OR REPLACE TYPE object_name AS OBJECT(
column_name type,
CONSTRUCTOR FUNCTION fun_name(
column_name1 NUMBER,
column_name2 VARCHAR2
)RETURN SELF AS RESULT,
CONSTRUCTOR FUNCTION fun_name(
column_name1 NUMBER,
column_name2 VARCHAR2
column_name3 NUMBER
)RETURN SELF AS RESULT
);
/

 

上面的對象包含兩個構造函數,注意是同名的,在調用類型是會自動按屬性來匹配

CREATE OR REPLACE TYPE BODY object_name AS
  CONSTRUCTOR FUNCTION fun_name(
    p_name1 NUMBER,
    p_name2 VARCHAR2
  )RETURN SELF AS RESULT IS
  BEGIN
    SELF.column_name1 :=p_name1;
    SELF.column_name2 :=p_name2;
    SELF.column_name3 :=default_val;
  RETURN ;
  END;

  CONSTRUCTOR FUNCTION fun_name(
    p_name1 NUMBER,
    p_name2 VARCHAR2,
    p_name3 NUMBER
  )RETURN SELF AS RESULT IS
  BEGIN
    SELF.column_name1 :=p_name1;
    SELF.column_name2 :=p_name2;
    SELF.column_name3 :=P_name3;
  RETURN ;
  END;
END;
/

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM