創建對象類型
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; /