--建立物件型別
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;
--如果物件是巢狀物件,可以通過設定深度來輸出子物件,下面是輸出兩級的。
setdescribe 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,***,***x));
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
orreplace 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
orreplace 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;
ORACLE 物件的使用
建立物件型別 create or replace type emp typ as object id number,name varchar2 30 sal number,comm number,member procedure change comm new comm number member ...
Oracle其他物件
b 檢視 b b 建立檢視 b create or replace view as b 序列 b b 建立序列 b create sequence increment by n start with n maxvalue n minvalue n cycle nocycle cache n noca...
oracle 物件許可權
sys使用者查詢ww使用者建立的表 已經commited select from ww.wwtable 普通使用者lisi查詢ww使用者的表 grant select on wwtable to lisi select from ww.wwtable 物件授權操作 grant insert on w...