posts - 60,comments - 71,trackbacks - 0

          本文來自:http://www.aygfsteel.com/improviser/archive/2007/10/02/150166.html

              關系數據庫在不斷地發展時,許多數據庫引入了面向對象的思想,這其中以Oracle為代表,Oracle9i就號稱面向對象數據庫。 自Oracle9i以來,Oracle就不再是單純的關系數據庫管理系統,它在關系數據庫模型的基礎上,添加了一系列面向對象的特性。Oracle的對象體系遵從面向對象思想的基本特征,許多概念同C++,JAVA中類似,具有繼承,重載,多態等特征,但又有自己的特點。

          1、
          Oracle面向對象的最基本元素是它的對象類型——Type
          下面開始寫自定義對象類型(
          as object 必須關鍵字)

          1 create or replace type ADDRESS as object
          2 (
          3      PROVINCE varchar(10),
          4      CITY varchar(20),
          5      STREET varchar(30)
          6 );


          創建表并使用以上對象類型ADDRESS

          1 create table STUDENTOBJ 
          2 (
          3     STUNAME varchar(20),
          4     STUADD  ADDRESS
          5 );
          6 
          7 向表中插入數據:
          8 insert into STUDENTOBJ values('improviser',ADDRESS('廣東省','廣州市''江海大道');


          通過別名對表進行查詢

          1 select S.STUNAME S.ADDRESS.PROVINCE S.ADDRESS.CITY
          2 S.ADDRESS.STREET 
          from STUDENTOBJ S;


          從上面的測試代碼,可以很容易看到其與面向對象語言(比如Java)的差異,不必使用new創建實例,也沒有了默認無參數構造器,默認使用定義的屬性作為構造器參數,足以描述各種實體。另外,Type的屬性沒有private,protected,public的說法,所有的屬性調用者都可以訪問,即都是public。

          2、Oracle中面向對象特征——繼承(父類型必須聲明為NOT FINAL,子類型使用關鍵字UNDER)

           1 創建父類型
           2 create or replace type PERSON as object
           3 (
           4     PERNAME varchar(10),
           5     PERSEX varchar(2)
           6 )not final;
           7 
           8 子類型繼承父類型
           9 create or replace type STUDENT under PERSON
          10 (
          11     STUNO varchar(8),
          12     STUSCORE varchar(10)
          13 );

          由以上定義,其子類型中屬性包含了父類型中所有屬性。

          3、可變數組
          可變數組,是一種集合。一個可變數組是對象的一個集合,其中每個對象都具有相同的數據類型。可變數組的大小由創建時決定。在表中建立可變數組后,可變數組在主表中作為一個列對待。

           1 創建對象類型
           2 create or replace type ADDRESS as object
           3 (
           4     PROVINCE varchar(10),
           5     CITY varchar(20),
           6 );
           7 
           8 創建ADDRESS可變數組
           9 create or replace type ADDRESS_LIST as varray(3of ADDRESS;
          10 
          11 創建表并使用可變數組ADDRESS_LIST
          12 create table STUDENT 
          13 (
          14     STUNAME varchar(20),
          15     STUADDS ADDRESS_LIST
          16 );
          17 
          18 向表中插入數據
          19 insert into STUDENT values('improviser',ADDRESS_LIST(ADDRESS('廣東省','廣州市','江海大道'),
                                                     ADDRESS(
          '廣東省','潮州市','潮楓路')));
          20 
          21 查詢(使用table函數將數據表格形式輸出)
          22 select *from table(select s.STUADDS from STUDENT where STUNAME='improviser');


          4、嵌套表
          嵌套表是表中之表,一個嵌套表是某些行的集合,它在主表中表示為其中的一列。對主表中的每一條記錄,嵌套表可以包含多個行。

           1 定義嵌套表方法:
           2 create or replace type ADDRESS_TABLE as table of ADDRESS;
           3 
           4 基本對象類型、創建表、查詢和插入數據都跟上面可變數組一樣
           5 
           6 嵌套表更新table轉化為表再利用表別名操作列進行更新
           7 update table(select S.STUADDS from STUDENT S where
           
          8  S.STUNAME = 'improviser') AD set AD.PROVINCE = '北京' where city = '廣州';
           9
          10刪除嵌套表記錄
          11delete from table(select S.STUADDS from STUDENT S
          12  
          where S.STUNAME = 'improviser') AD where AD.city = '潮州市';
          13



              比較:可變數組,查詢速度快,但是更新困難得整體更新,適用與數據不修改情況,如醫生處方。使用嵌套表可以對表中的表內容進行修改而無需進行整體更新操作。

          4、對象表

           1 首先創建對象類型
           2 create or replace type OFFICETYPE as object
           3 (
           4     id varchar(10),
           5     typename varchar(20)
           6 );
           7 
           8 將對象類型轉化為對象表
           9 create table office of officetype;
          10 
          11 創建對象關系表(使用ref ,指示OID進行對象表關聯)
          12 create table worker
          13 (
          14     workerid varchar(10primary key,
          15     workername varchar(20),
          16     workeroffice ref officetpey scope is office,
          17     phone varchar(20)
          18 );
          19 
          20 使用deref 取得關聯對象表相關內容
          21 select workerid,workername,deref(w.workeroffice),phone from worker w
            
          where workerid = 'C001';
          22 結果為
          23 C001   張小明  OFFICETYPE('0001''財務科')      010-12345
          24 
          25 使用VALUE(別名)查詢對象內容
          26 select value(o) from office o;
          27 


          5、對象視圖

          1 創建對象視圖(通過OID連接dept)
          2 create view deptview of deptype with object oid(deptno) as select *from dept;
          3 create view emp_view as select make_ref(deptview,deptno) deptoid,empno,ename
          4   from emp;


          好了,有關Oracle中面向對象的內容就簡要敘述這么多了,雖然現在很少使用到,但在以后有用到之處有一定的參考作用。

          posted on 2008-06-18 17:42 henry1451 閱讀(339) 評論(0)  編輯  收藏 所屬分類: Oracle技術
          主站蜘蛛池模板: 绥中县| 塔城市| 凤山县| 应用必备| 蒙阴县| 绥阳县| 玉门市| 东阿县| 顺昌县| 旺苍县| 衡山县| 河曲县| 丹寨县| 峡江县| 苗栗县| 威信县| 阜宁县| 隆化县| 驻马店市| 克东县| 互助| 济南市| 隆昌县| 丹阳市| 通城县| 体育| 沛县| 资源县| 石泉县| 栾城县| 桃江县| 安顺市| 布拖县| 霸州市| 伊春市| 佛教| 广饶县| 桐庐县| 额尔古纳市| 怀仁县| 健康|