瘋狂

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

          oracle中的對象及測試

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

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

           

          /**//**
           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表示當(dāng)前對象如同java里面的this
           end;
          end ;

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


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

          create or replace type testm as OBJECT(
            name 
          varchar2(10),
            sex 
          char(2), 
            constructor 
          function testm(--一個參數(shù)的構(gòu)造函數(shù)
              p_name varchar2
            ) 
          return self as result,
            
            constructor 
          function testm(--二個參數(shù)的構(gòu)造函數(shù)
              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(--一個參數(shù)的構(gòu)造函數(shù)
              p_name varchar2
            ) 
          return self as result is
           
          begin
              self.name:
          =p_name;
              
          return;
           
          end ;
             constructor 
          function testm(--一個參數(shù)的構(gòu)造函數(shù)
              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標(biāo)示
           被繼承的對象必須定義為 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);
          --調(diào)用繼承的方法,和繼承的屬性
          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);
          --調(diào)用繼承的方法,和繼承的屬性
          end;
          --(6)使用對象定義表中的列----------
          create table test00(
           tuser person,
           remark 
          varchar2(100)


          --insert into test00 values(person('joe','01',sysdate,'123456'),/*參數(shù)個數(shù)必須夠*/'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)對象引用,每一列都是目標(biāo)表中的列的引用
          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中的對象及測試  回復(fù)  更多評論   

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

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

          2011-08-22 17:21 by 站長工具
          http://tool.zbole.com/
          主站蜘蛛池模板: 富平县| 新沂市| 贵定县| 孙吴县| 台中县| 福清市| 湖南省| 保亭| 镇坪县| 阿合奇县| 准格尔旗| 洪洞县| 克拉玛依市| 高台县| 攀枝花市| 武功县| 焦作市| 辽宁省| 鹤庆县| 周宁县| 五家渠市| 霞浦县| 元阳县| 神池县| 贵德县| 柳林县| 浮梁县| 许昌县| 息烽县| 大姚县| 永宁县| 临洮县| 乌苏市| 嘉峪关市| 无极县| 永济市| 唐海县| 西宁市| 易门县| 平顶山市| 宁津县|