Oracle學習筆記---(五)
五
一,定義抽象資料類型
/*
create or replace type animal_ty as object
(breed varchar2(25), --動物種類
name varchar2(25), --名字
birthdate date, --出生日期
member function AGE(birthdate in date) return number --根據出生日期計算年齡
); --帶有方法的抽象資料類型
*/
create or replace type animal_ty as object
(Bread varchar2(25), --動物種類
name varchar2(25), --名字
hobby varchar2(10) --愛好
);
desc animal_ty;
查看 user_types;
user_type_attrs;
二,抽象資料類型的使用
1)建立關係表
drop table animal;
create table animal
(id number primary key ,
anima animal_ty
);
set desc depth 3
desc animal;
2) 插入資料(使用構造方法)
insert into animal values(1, animal_ty('MULE','FRANCES','PLAY'));
insert into animal values(2, animal_ty('DOG','BENJI','EAT'));
insert into animal values(3, animal_ty('CROCODILE','LYLE','SWIM'));
3)操作
查看:select f.anima.name from animal f;
更新: update animal f set f.anima.hobby='PLAY1' where id=1;
刪除:delete from animal a where a.anima.hobby='PLAY1';
2,刪除物件類型
drop type animal_ty force;
3,查詢相關性
select name,type from user_dependencies where referenced_name='ANIMAL_TY';
4,在抽象資料類型上建立索引
create index Idx on animal(anima.name);
5,final 和 not final 修飾類型
instantiable 和not instantiable 可修飾類型和方法
預設情況下,抽象資料類型是不能被繼承的,同時類型提供建構函式,類型中的方法可以被實
現
宣告類型加 not final 該類型可被繼承
修飾方法: not instantiable 類型不提供方法實現
修飾類型: not instantiable 類型沒有建構函式.不能執行個體化
二,可變數組
1)建立VARRAY類型
create or replace type tools_va as varray(5) of varchar2(25);
2)建立關係表,該表的欄位類型是varray類型
create table borrower(name varchar2(25) primary key,
tools tools_va);
字典
select typecode,attributes from user_types where type_name='TOOLS_VA';
select coll_type,elem_type_owner,elem_type_name,upper_bound,
length from user_coll_types;
3)插入資料
insert into borrower values ('JED HOPKINS',
Tools_va('HAMMER','SLEDGE','AX'));
insert into borrower values('PK',
Tools_va('PEN1','PEN2','PEN3'));
4)查看
select * from table(select t.tools from borrower t where t.name='PK');
三,巢狀表格
drop type emp_ty force;
1,
create or replace type emp_ty as object
( empno number,
ename char(10),
sal number);
2,create or replace type emps_nt as table of emp_ty;
3,
create table ntdept
(
deptno number,
dname varchar2(20),
loc varchar2(20),
dno_det emps_nt)
nested table dno_det store as emp_nt_tab;
--插入資料
insert into ntdept values
(10,'市場部','海珠北路',emps_nt(emp_ty(100,'MARRY',1000),
emp_ty(101,'Lili',1500),
emp_ty(102,'KHK',3000))
);
insert into ntdept values(20,'教務部','海珠南路',emps_nt(emp_ty(103,'JAKE',2200),
emp_ty(104,'ROSE',1000),
emp_ty(105,'LUSU',2000)
));
--查詢
可以使用the或table
select deptno,dname,loc,dno_det from ntdept;
select dno_det from ntdept where deptno=10;
select nt.* from table(select dno_det from ntdept where deptno=10) nt;
select nt.* from table(select dno_det from ntdept where deptno=20) nt where
nt.empno=103 ;
select nt.empno,nt.ename from table(select deptno from ntdept where deptno=10)
nt where nt.empno=101;
--插入
insert into table(select dno_det from ntdept where deptno=10)
values(106,'HANG',3000);
或從巢狀表格中選擇資料插入
insert into ntdept values(40,'NEWd','NEWloc',
cast(multiset(select * from table(select dno_det from ntdept where deptno=10)
nt where nt.empno=100 ) as emps_nt))
cast:將查詢的結果轉換成巢狀表格的形式
multiset:允許cast查詢中包含多條記錄
--更新
update table(select dno_det from ntdept where deptno=10) nt set nt.ename='LLLL'
where nt.empno=101;
--刪除
delete from the(select dno_det from ntdept where deptno=10) nt where
nt.empno=101
四,對象表
1,建立物件類型
drop type animal_ty force;
create type animal_ty as object
(name varchar2(15),
hobby varchar2(20)
)
/
2,建立對象表
create table animal of animal_ty(name constraint pk primary key);
3,插入資料
insert into animal values(animal_ty('SNAKE','PLAY'));
insert into animal values(animal_ty('DOG','SWIM'));
insert into animal values(animal_ty('CAT','SLEEP'));
4,查看oid
select ref(f) from animal f;
5,查看對象
select value(r) from animal r;
使用deref
drop table keeper;
create table keeper
(
keepername varchar2(10),
animalkept ref animal_ty
)
插入資料
insert into keeper select 'JEK',ref(f) from animal f where name='DOG';
insert into keeper select 'BLK',ref(f) from animal f where name='CAT';
查看資料
在關係表中看對象
select deref(animalkept) from keeper;
假設刪掉一個對象
delete from animal where name='DOG';
select * from keeper; 還在引用該對象
update keeper set animalkept=null where animalkept is dangling;--去掉引用
五,物件檢視
將dept關係表做為對象表訪問
1,建立物件類型
create or replace type dept_type as object
(dno number(2),
dname varchar2(15),
local varchar2(18)
);
2,建立物件檢視
create view dept_view of dept_type with object oid
(dno) as
select * from dept ;
3,通過物件檢視操縱關係表資料
insert into dept_view values(dept_type(60,'aaa','bbb'));
delete from dept_view where deptno=60;
結果會反映到關係表中,當改變關係表資料時,也會反映到物件檢視中
物件檢視每行都有一個oid
4,當關係表之間存在參考關聯性時,也可以用物件檢視實現
dept 和 emp 是主、外鍵表,emp表的deptno引用了dept表的deptno
並且已為關係表dept產生了物件檢視,此時關係表的每一個行都具有oid
dept表的行可以作為行對象通過dept_view視圖進行訪問,只要為關係表建立
了物件檢視,即可將任何關係表作為行對象進行訪問
--make_ref只對所提供的參數應用一個Oracle內部的演算法,即可得到引用,它並沒有真
正閱讀檢視。
select make_ref(dept_view,deptno) from dept;
select make_ref(dept_view,deptno) from emp;
5,通過物件檢視建立參考關聯性
create view emp_ov as select make_ref(dept_view,deptno) dep,empno,ename,sal
from emp;
該視圖第一列指向了物件檢視dept_view的行
select deref(a.dep) from emp_ov a;