Oracle學習筆記—(五)

來源:互聯網
上載者:User
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;

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.