即興的靈感

          思維是一種藝術; 藝術需要靈感。

          博客好友

          最新評論

          Oracle中的面向對象OOP

          ??? 關系數據庫在不斷地發展時,許多數據庫引入了面向對象的思想,這其中以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(3)?of
          ?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 刪除嵌套表記錄
          11 delete ? 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(10)?primary?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 2007-10-02 11:44 poetguo 閱讀(3532) 評論(0)  編輯  收藏 所屬分類: Oracle

          主站蜘蛛池模板: 武隆县| 浏阳市| 遂平县| 毕节市| 五指山市| 漳平市| 郸城县| 富蕴县| 浑源县| 偃师市| 湖北省| 琼结县| 浏阳市| 福安市| 榕江县| 巩义市| 叙永县| 安泽县| 泰来县| 安宁市| 玉屏| 沁水县| 珠海市| 东阿县| 云安县| 婺源县| 尚志市| 灵丘县| 芒康县| 会同县| 吉木萨尔县| 甘泉县| 开江县| 武隆县| 乌恰县| 永春县| 略阳县| 荔波县| 延川县| 湟源县| 襄汾县|