瘋狂

          STANDING ON THE SHOULDERS OF GIANTS
          posts - 481, comments - 486, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          oracle中的對象及測試

          Posted on 2011-08-21 15:38 瘋狂 閱讀(1621) 評論(2)  編輯  收藏 所屬分類: database

           oracle8 發布的時候,數據庫中就可以使用對象了,可以定義自己的類,也就是對象類型,和java里面的類相似,都可以包含構造函數,屬性和方法。,對象類型有時候也成為用戶自定義類型。以下是相關使用說明和測試:

           

          /**//**
           oracle對象實例及測試
          */

          ---(1)測試對象
          create or replace type PERSON as Object(
             name 
          varchar2(100),
             sex 
          char(2),
             birth date,
             pwd 
          varchar2(32),
             member 
          function geName return varchar2
          )
          create or replace type body PERSON  as 
           member 
          function geName return varchar is 
           
          begin
           
          return self.birth;--self表示當前對象如同java里面的this
           end;
          end ;

          --(2)在plsql中使用對象
          declare
          tuser person;
          begin
            tuser :
          = person('joe2','01',sysdate,'123456');
            dbms_output.put_line(tuser.geName);
          --調用方法
          end;


          ---(3)在對象中使用構造函數,過程和靜態屬性和方法
          /*
          1  構造函數使用constructor聲明
          2  構造函數return self as result聲明結尾, 
          3  構造函數屬性不需要定義長度 eg:varchar2
           static 不能用member聲明
           sttatic 不能聲明屬性,只能聲明function和procedure
           static 的方法和函數使用的時候直接用 對象類型.XX
          */

          create or replace type testm as OBJECT(
            name 
          varchar2(10),
            sex 
          char(2), 
            constructor 
          function testm(--一個參數的構造函數
              p_name varchar2
            ) 
          return self as result,
            
            constructor 
          function testm(--二個參數的構造函數
              p_name varchar2,
              p_sex 
          char
            ) 
          return self as result,
            member 
          function getSex return char,
            static 
          function getSexByCode(code in charreturn varchar2,
            member 
          procedure getSexCN ,
            static  
          procedure getSexCNByCode(code in char,str out varchar2)
          );
          create or replace type body testm is
           constructor 
          function testm(--一個參數的構造函數
              p_name varchar2
            ) 
          return self as result is
           
          begin
              self.name:
          =p_name;
              
          return;
           
          end ;
             constructor 
          function testm(--一個參數的構造函數
              p_name varchar2,
              p_sex 
          char
            ) 
          return self as result is
           
          begin
              self.name:
          =p_name;
              self.sex:
          =p_sex;
              
          return;
           
          end ;
            member 
          function getSex return char as
            
          begin
               
          return self.sex;
             
          end getSex;
             member 
          procedure getSexCN  as
              
          begin
                
          if self.sex='01' then
                  dbms_output.put_line(
          '');
               
          else
                  dbms_output.put_line(
          '');
                
          end if;
              
          end getSexCN;
              static 
          function getSexByCode(code in charreturn varchar2 as
              
          begin
                
          if code='01' then
                  
          return '';
               elsif code 
          ='02' then
                  
          return '';
                
          else return '中性';
                
          end if;
              
          end getSexByCode;
              static  
          procedure getSexCNByCode(code in char,str out varchar2as
              
          begin
                
          if code='01' then
                  
          str:= '';
               elsif code 
          ='02' then
                  
          str:= '';
                
          else str:= '中性';
                
          end if;
               
          end getSexCNByCode;

          end;

          --測試
          declare
          obj testm;
          sexstr 
          varchar2(4);
          begin
            obj :
          = testm('01');
            dbms_output.put_line(obj.getSex);
            obj.getSexCN;
             dbms_output.put_line(testm.getSexByCode(
          '03'));
             testm.getSexCNByCode(
          '03',sexstr);
             dbms_output.put_line(sexstr);
          end;
          --------------------------------
          --
          (4)類型繼承---------------------------
          /**//*
           使用 under標示
           被繼承的對象必須定義為 NOT FINAL
           如果類型僅僅作為超類,不被實例化(類似于java中的abstract)定義為:not instantiable
          */

          create or replace type PARENTOBJ as Object(
             name 
          varchar2(100),
             sex 
          char(2),
             member 
          function geName return varchar2
          NOT FINAl;
          create type body PARENTOBJ is
             member 
          function geName return varchar2 as
             
          begin
              
          return self.name;
             
          end;
          end;
          create or replace type SUB_OBJ under PARENTOBJ(
           birth date
          )
          --測試
          declare
          obj SUB_OBJ;
          begin
            obj :
          = SUB_OBJ('joe2','01',sysdate);
            dbms_output.put_line(obj.geName);
          --調用繼承的方法,和繼承的屬性
          end;
          ---------------------------------------
          --
          (5)重寫------------------------------
          /**//*
           重寫方法和過程需要在聲明和body里面聲明為overriding
          */

          create or replace type SUB_OBJ2 under PARENTOBJ(
           birth date,
          overriding member 
          function geName return varchar2--重寫父類的方法
          )
          create or replace type body SUB_OBJ2 is
             member 
          function geName return varchar2 as
             
          begin
              
          return '我的名字是:'||self.name;
             
          end;
          end;
          --測試
          declare
          obj SUB_OBJ2;
          begin
            obj :
          = SUB_OBJ2('joe2','01',sysdate);
            dbms_output.put_line(obj.geName);
          --調用繼承的方法,和繼承的屬性
          end;
          --(6)使用對象定義表中的列----------
          create table test00(
           tuser person,
           remark 
          varchar2(100)


          --insert into test00 values(person('joe','01',sysdate,'123456'),/*參數個數必須夠*/'remarkcontent');
          --
          select t.tuser.name  from test00 t;--必須使用表別名
          --
          delete from test00 t where t.tuser.name='joe';
          --
          --------------------------------------------
          --
          (7)使用對象定義整個表
          create table testoo1 of person;
          --insert into testoo1 values(person('joe2','01',sysdate,'123456'));
          --
          select t.*  from testoo1 t;
          --
          delete from testoo1 where name='joe';
          --
          ----------------------------------------------
          --
          (8)對象引用,每一列都是目標表中的列的引用
          create table testoo2(
             id 
          number primary key,
             tuesr ref person scope 
          is testoo1
          )
          --insert into testoo2 values(1,(select ref(oo1) from testoo1 oo1 where oo1.name='joe'));
          --
          update testoo2 o2 set o2.tuesr=(select ref(oo1) from testoo1 oo1 where oo1.name='joe2') where o2.id=1
          --
          -----------------------------------------------

           


          評論

          # re: oracle中的對象及測試  回復  更多評論   

          2011-08-22 17:20 by 站長工具
          不錯的開源。

          # re: oracle中的對象及測試  回復  更多評論   

          2011-08-22 17:21 by 站長工具
          http://tool.zbole.com/
          主站蜘蛛池模板: 北辰区| 福州市| 巴中市| 锦州市| 垣曲县| 武邑县| 安龙县| 岢岚县| 嘉兴市| 清远市| 凤山市| 新乐市| 广宁县| 托里县| 邵武市| 东兴市| 北碚区| 萨嘎县| 昌黎县| 奎屯市| 怀柔区| 冀州市| 昌都县| 准格尔旗| 方正县| 花莲市| 黄平县| 亳州市| 长子县| 长顺县| 吴川市| 武乡县| 卓尼县| 贺州市| 上高县| 都江堰市| 东源县| 博湖县| 大名县| 揭东县| 尖扎县|