Decode360's Blog

          業(yè)精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
            397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
          對象
          ?
          ??? 在Oracle中把對象作為一種數(shù)據(jù)類型object,不但可以包含基本的數(shù)據(jù)類型集合,還可以為其定義函數(shù)過程作為其方法。
          ?
          ??? 創(chuàng)建格式如下:

          ??? create or replace type person as object

          ??? ? (

          ??? ??? NAME varchar2 ( 10 ),

          ??? ??? SEX char ( 2 ),

          ??? ??? BIRTHDATE date ,

          ??? ??? PLACE varchar2 ( 100 )

          ??? ? );

          ?
          ??? 注意:不能在數(shù)據(jù)類型中定義以下類型:
          ???????? 1.LONG、LONG RAW
          ???????? 2.ROWID
          ???????? 3.PL/SQL特定類型(BINARY_INTEGER、BOOLEAN、%TYPE、%ROWTYPE)
          ???????? 4.程序包中自定義的數(shù)據(jù)類型
          ?
          ?
          構(gòu)造函數(shù)
          ?
          ??? 使用之前創(chuàng)建的對象建立構(gòu)造函數(shù):

          ?

          ??? declare

          ??? ? person_one person;

          ??? begin

          ??? ? person_one:=person( ' 張三 ' , ' ' , date '2008-10-11' , ' 杭州 ' );

          ??? ? dbms_output.put_line(person_one.name);

          ??? end ;

          ?
          ??? 說明:先創(chuàng)建了一個(gè)person類型的局部變量,再為該變量創(chuàng)建了一個(gè)實(shí)例。 在實(shí)例化中用到的person是系統(tǒng)的構(gòu)造函數(shù),可以對person類型變量進(jìn)行賦值,該構(gòu)造函數(shù)在對象創(chuàng)建時(shí)由系統(tǒng)自動(dòng)創(chuàng)建,與對象的名稱相同。
          ?
          ??? 注:創(chuàng)建對象實(shí)例時(shí)必須提供全部參數(shù),否則報(bào)錯(cuò)。
          ?
          ?
          引用對象類型
          ?
          ??? 可以創(chuàng)建實(shí)例化的對象之后,將該對象插入到堆表中。
          ?
          ??? 1、例如創(chuàng)建含有person類型數(shù)據(jù)的表:

          ?

          ??? create table t_person(

          ??? ? person_col person,

          ??? ? emp_id number ,

          ??? ? dep_id number );

          ?
          ??? 2、直接插入數(shù)據(jù):
          ?
          ??? insert into t_person values (person( ' 張三 ' , ' ' , date '2008-10-11' , ' 杭州 ' ), 12345 , 11 );

          ??? commit ;

          ?
          ??? 3、也可以在PL/SQL中先創(chuàng)建保存實(shí)例的變量,再進(jìn)行插入:
          ?

          ??? declare

          ??? ? person_one person;

          ??? begin

          ??? ? person_one:=person( ' 李四 ' , ' ' , date '2008-10-20' , ' 上海 ' );

          ??? ? insert into t_person values (person_one, 12345 , 11 );

          ??? ? commit ;

          ??? end ;

          ?
          ??? 4、之后可進(jìn)行查詢數(shù)值:
          ?
          ??? SQL > select * from t_person;
          ???

          ??? PERSON_COL( NAME , SEX, BIRTHDATE, PLACE)????????? EMP_ID???? DEP_ID

          ??? ---------------------------------------------??? ---------? ---------

          ??? PERSON( ' 張三 ' , ' ' , '11-OCT-08' , ' 杭州 ' )???????? 12345 ???????? 11

          ??? PERSON( ' 李四 ' , ' ' , '20-OCT-08' , ' 上海 ' )???????? 12345 ???????? 11

          ?
          ?
          ??? 5、若需要查詢對象中的某個(gè)變量,則必須在最前面加上表名
          ?
          ??? SQL > select a.person_col.NAME from t_person a;
          ?

          ??? PERSON_COL.NAME

          ??? ----------------

          ??? 張三

          ??? 李四

          ?
          ??? 注:當(dāng)在某表中加入對象后,對象在table被drop之前不能被drop。
          ?
          ?
          方法
          ?
          ??? 對象類型內(nèi)的function和procedure都是方法,可以重載。Oracle的對象類型共有5種方法:實(shí)例方法類方法構(gòu)造函數(shù)映射方法排序方法
          ?
          ??? 1、實(shí)例方法和類方法
          ?
          ??? 實(shí)例方法是必須創(chuàng)建實(shí)例后才可以調(diào)用的方法,而類方法可以在創(chuàng)建實(shí)例前調(diào)用。實(shí)例方法用member聲明,類方法用static
          ?
          ??? 創(chuàng)建type和type body:
          ?

          ??? create or replace type person as object

          ??? ? (

          ??? ??? NAME varchar2 ( 10 ),

          ??? ??? SEX char ( 2 ),

          ??? ??? BIRTHDATE date ,

          ??? ??? PLACE varchar2 ( 100 ),

          ??? ??? member procedure chang_name( name varchar2 ),

          ??? ??? static function new (v_name varchar2 ,v_sex varchar2 ) return person

          ??? ? );

          ?

          ??? create or replace type body person is

          ??? ? member procedure chang_name( name varchar2 ) is

          ??? ??? begin

          ??? ????? self.name:= name ;

          ??? ??? end chang_name;

          ??? ? static function new (v_name varchar2 ,v_sex varchar2 ) return person

          ??? ? is

          ??? ??? begin

          ??? ????? return (person(v_name,v_sex, null , null ));

          ??? ??? end new ;

          ??? end ;

          ?
          ??? 在過程中調(diào)用兩種不同類型的方法:
          ?

          ??? declare

          ??? ? person_one person;

          ??? ? person_two person;

          ??? begin

          ??? ? person_one:=person( ' 李四 ' , ' ' , date '2008-10-20' , ' 上海 ' );--創(chuàng)建實(shí)例

          ??? ? person_one.chang_name( ' 王五 ' );

          ??? ? dbms_output.put_line(person_one.name);

          ?

          ??? ? person_two:=person.new( ' 小張 ' , ' ' );--可直接調(diào)用

          ??? ? dbms_output.put_line(person_two.name);

          ??? end ;

          ?
          ?
          ??? 2、映射方法
          ?
          ??? 由于將對象作為字段時(shí),對象中包含很多參數(shù)須發(fā)進(jìn)行比較,此時(shí)可以為對象創(chuàng)建映射方法。
          ??? 在創(chuàng)建映射方法后,如果用到where 或 order by 以及 <>= 等比較關(guān)系時(shí),自動(dòng)調(diào)用映射方法。
          ?
          ??? 注:映射方法不帶參數(shù),且只能有一個(gè)。
          ?
          ??? 創(chuàng)建type和type body:

          ?

          ??? create or replace type person as object

          ??? ? (

          ??? ??? NAME varchar2 ( 10 ),

          ??? ??? SEX char ( 2 ),

          ??? ??? BIRTHDATE date ,

          ??? ??? PLACE varchar2 ( 100 ),

          ??? ??? map member function compare return date

          ??? ? );

          ??? ?

          ??? create or replace type body person is

          ??? ? map member function compare return date is

          ??? ??? begin

          ??? ????? return self.birthdate;

          ??? ??? end compare;

          ??? end ;

          ?
          ??? 調(diào)用映射方法進(jìn)行比較:
          ?

          ??? declare

          ??? ? person_one person;

          ??? ? person_two person;

          ??? begin

          ??? ? person_one:=person( ' 李四 ' , ' ' , date '2008-10-20' , ' 上海 ' );

          ??? ? person_two:=person( ' 小張 ' , ' ' , date '2008-10-11' , ' 杭州 ' );

          ??? ? if person_one > person_two then

          ??? ??? dbms_output.put_line(person_one.name|| ' ' ||person_two.name|| ' ' );

          ??? ??? elsif person_one < person_two then

          ??? ????? dbms_output.put_line(person_two.name|| ' ' ||person_one.name|| ' ' );

          ??? ? else dbms_output.put_line( ' 一樣大 ' );

          ??? ? end if ;

          ??? end ;

          ?
          ?
          ??? 3、排序方法
          ?
          ??? 排序方法主要為了簡化比較對象大小的值,相當(dāng)于sign
          ?
          ??? 舉例說明,創(chuàng)建type和type body:
          ?

          ??? create or replace type person as object

          ??? ? (

          ??? ??? NAME varchar2 ( 10 ),

          ??? ??? SEX char ( 2 ),

          ??? ??? BIRTHDATE date ,

          ??? ??? PLACE varchar2 ( 100 ),

          ??? ??? order member function match(p_person person) return integer

          ??? ? );

          ?

          ??? create or replace type body person is

          ??? ? order member function match(p_person person) return integer is

          ??? ??? begin

          ??? ????? if self.birthdate > p_person.birthdate then

          ??? ??????? return 1 ;

          ??? ??????? elsif self.birthdate < p_person.birthdate then

          ??? ????????? return - 1 ;

          ??? ??????? else return 0 ;

          ??? ????? end if ;

          ??? ??? end match;

          ??? end ;

          ?
          ??? 調(diào)用排序函數(shù):
          ?

          ??? declare

          ??? ? person_one person;

          ??? ? person_two person;

          ??? ? k int ;

          ??? begin

          ??? ? person_one:=person( ' 李四 ' , ' ' , date '2008-10-20' , ' 上海 ' );

          ??? ? person_two:=person( ' 小張 ' , ' ' , date '2008-10-11' , ' 杭州 ' );

          ??? ? k:=person_one.match(person_two); --one 調(diào)用 match 去和 two 比較

          ??? ? dbms_output.put_line(k);

          ??? end ;

          ?
          ??? 注:當(dāng)排序大量對象時(shí),適合用MAP,當(dāng)反復(fù)比較時(shí),適合用ORDER
          ?
          posted on 2008-10-16 18:59 decode360 閱讀(2987) 評論(0)  編輯  收藏 所屬分類: 07.Oracle
          主站蜘蛛池模板: 钦州市| 景洪市| 伽师县| 大竹县| 浙江省| 佛教| 六盘水市| 旅游| 武威市| 淮安市| 韶关市| 井冈山市| 北海市| 海阳市| 瑞安市| 桃园县| 五河县| 佛教| 阆中市| 秭归县| 沛县| 佛坪县| 科尔| 贡觉县| 苍南县| 文化| 伽师县| 福州市| 沙田区| 邵阳县| 浮山县| 新乡市| 英吉沙县| 浦东新区| 高密市| 唐河县| 通海县| 勐海县| 马边| 吴忠市| 凤阳县|