oracle 对象类型 object type

/* 对象类型属于用户自定义的一种复合类型,它封装了数据结构和拥有操作这些数据结构的函数。

    对象类型;对象类型体和对象类型规范组成
    对象类型属性不能使用以下类型定义。如;long,rowid,%type,%rowtype,ref cursor,record, pls_integer等
    涉及到成员方法。构造方法,静态方法,map方法(将对象类型进行比较,因为对象不像标量那样可以直接排序),最大只能定义一个map 方法
    map方法可以对个对象进行排序,而order方法只能对两个对象实例比较大小 ,map和order不能同时定义。
   
    《1》对象表
        对象表是包含对象类型列的表,而普通表其列全部使用标量数据类型。分为行对象表和列对象表
        1.行对象表,
          eg; create table obj_emp of emp_type;
        2.列对象(包含多个列)
          eg; create table obj_emp(
             dno number,dname varchar2(10),
             emp emp_type
          );
         
       《2》对象类型继承  
       《3》引用对象类型 ref(指向对象的逻辑指针,是oracle的一种内置数据类型)(通过引用可以使不同表共享相同对象,从而降低内存占用)
             如 create table obj_emp2 (
                dno number,
                emp ref obj_emp  --引用上面的行对象
             );
         
        
      
       《4》建立对象类型
            1.建立无方法的对象类型
            create or replace type emp_type as object (
               name varchar2(8),
               birthdate date
            );
            --建立行对象表
            create table emp_tab of emp_type ;
            --插入数据
            insert into emp_tab values('tom',to_date('1980-1-25','yyyy-mm-dd'));--普通插入
            insert into emp_tab values(emp_type('sam',to_date('1983-1-25','yyyy-mm-dd'))); --采用对象类型构造方法插入
           
           -- 在pl/sql块中,如果要将对象数据检索到对象变量中,则必须用value方法
               declare
                 emp emp_type;
               begin
                  select value(p) into emp from emp_tab p where p.name = '&name';
                  dbms_output.put_line(emp.birthdate);
               end;
          
           -- 更新行对象数据,如果根据对象属性更新数据时必须定义对象别名
               eg; update emp_tab p set p.birthdate=to_date('2000-1-23',yyyy-mm-dd) where p.name=&name;
          
           -- 删除行对象类型数据是如果根据对象属性删除数据 ,则删除时必须定义别名
               begin
                   delete from emp_tab p where p.name=&name;
               end;
               /
           
           ==============================================================================================  
            
             -- 创建列对象表
               create or replace type emp_l_tab as object (
                   dname varchar2(),emp emp_type
               );
             -- insert (用对象类型的构造方法插入数据)
               insert into emp_l_tab values('db' emp_type('tom',to_date('2011-06-14',sysdate)));
               
             -- 检索列对象
                检索行对象类型数据到类型变量时必须用value方法,但检索列对象时可以直接检索到类型变量
                 declare
                 v_emp_l emp_type ;
                 v_dname varchar2(20) ;
                 select dname,emp into v_dname,emp from emp_l_tab b where b.dname=&dname;
                 
            --更新列对象时,必须为列对象定义别名(列对象别名.对象类型列名.对象属性名)
              update emp_l_tab b set b.emp.birthdate = to_date('2011-06-14','yyyy-mm-dd') where b.dname=&dame;
              
             --删除类同更新数据
             
             
          
            2.建立有方法的对象类型
             1》 建立和使用member(成员)方法的对象类型(建立对象类型规范)
               eg;
               create or replace type emp_m_type as object(
                  dname varchar2(20), ddate date,addr varchar2(100),
                  member procdure proc_change_addr(newaddr dname),
                  member function  func_get_dname return varchar2
               );
               /
             2》建立对象类型体
               create or replace type body emp_m_type is
                 member procdure  proc_change_addr(newaddr varchar2)
                  is
                  begin
                    addr ;= newaddr;
                  end;
   
                 member function func_get_dname return varchar2
                  is
                    v_dname varchar2(20);
                  begin
                      v_danme := '部门:'||dname ||'--'|| birthdate ;
                    return v_danme;   
                  end;
                end;
                /
               
               -- 插入数据类同上面
               -- 提前数据
                  declare
                      v_emp emp_m_type;
                  begin
                     v_emp ;= emp.get_dname('上海徐汇');
                  ......................
                  end;
                  /
            
            
             --3 建立和使用static 方法
           static 方法用于访问对象类型,如果需要在对象类型上执行全局操作,则应该定义static
           方法。只能有对象类型访问static
             create or replace type emp_type3 as object(
                 name varchar2(10),gender varchar2(2),
                 static function getname return varchar2,
                 member function get_gender return varchar2
             );
          --建立对象类型体
           
             create or replace type body emp_type3 is
             static function getname return varchar2 is
             begin
               return 'jecker';
             end;
           
             member function get_gender return varchar2
              is
              begin
                return 'xingbie='||gender;
              end;
           end;    
           ;

          -- 基于对象类型emp_type3 建立 emp_tab3
          create table emp_tab3(
             eno number(6),emp emp_type3,
             sal number(6,2),job varchar2(10)
          );   
         
       -- 向表emp_tab3插入数据
            begin
              insert into emp_tab3(eno,sal,job,emp)
                values(100001,9999,'CTO/CIO',emp_type3(
                  'jeckery',emp_type3.getname()
                ));
            end;
             
      -- 访问 静态static函数和成员方法(member)
          declare
            e emp_type3;
            begin
               select t.emp into e from emp_tab3 t where rownum=1;
               raise_application_error(-20201,emp_type3.getname()||'-----'||e.get_gender());
            end;
                  
        
      
      -- 4.建立和使用 map 方法
       map方法用于将对象实例映射成标量值。
       
      -- 建立对象类型emp_type4
        create or replace type emp_type4 as object(
           name varchar2(10),
           birthdate date,
           map member function get_birdate return varchar2
        );

        -- 为emp_type4 对象类型实现方法体
        create or replace type body emp_type4 is
           map member function get_birdate return varchar2 is
           begin
             return trunc((sysdate-birthdate)/365);
           end;
         end;
                   
        -- 根据对象类型empa_type4 创建表emp_tab4
        create table emp_tab4 (
            eno number(6),sal number(6,2),
            job varchar2(20),emp4 emp_type4
        );
        -- 插入数据到emp_tab4           
        begin
          insert into emp_tab4(eno,sal,job,emp4)
                  values(0011,9000,'dba',emp_type4('jacker',to_date('1990-12-19','yyyy-mm-dd')));
          insert into emp_tab4(eno,sal,job,emp4)
                  values(0022,9900,'dba',emp_type4('jacker',to_date('1970-12-2','yyyy-mm-dd')));
        end;

        --比较数据
        declare
            type emp4_tab is table of  emp_type4;
             v_emp4_tab emp4_tab;
             v_result varchar2(100);
            begin
               select emp4 bulk collect into v_emp4_tab from emp_tab4 ;
                if v_emp4_tab(1).get_birdate()>v_emp4_tab(2).get_birdate() then
                  v_result :=  v_emp4_tab(1).name ||' 比 '||v_emp4_tab(2).name ||'大';
                else
                    v_result := v_emp4_tab(1).name ||' 比 '||v_emp4_tab(2).name ||'小';
                end if;    
                raise_application_error(-20201,v_result);
            end;

        
        
        
        -- 5 建立order 方法
          1.order 与 map 在一个对象类型中不能同时存在
          2.order 用于比较对象的2个实例大小
          
          -- 建立对象类型emp_type4
            create or replace type emp_type5 as object(
               name varchar2(10),
               birthdate date,
               order member function compare(emp5 emp_type5) return int
            );

            -- 为emp_type4 对象类型实现方法体
            create or replace type body emp_type5 is
               order member function compare(emp5 emp_type5) return int is
               begin
                  case
                     when birthdate>emp5.birthdate then return 1;
                     when birthdate=emp5.birthdate then return 0;
                     when birthdate<emp5.birthdate then return -1;
                  end case;
               end;
             end;
                       
            -- 根据对象类型empa_type4 创建表emp_tab4
            create table emp_tab5 (
                eno number(6),sal number(6,2),
                job varchar2(20),emp5 emp_type5
            );
            -- 插入数据到emp_tab4           
            begin
              insert into emp_tab5(eno,sal,job,emp5)
                      values(0011,9000,'dba',emp_type5('jacker',to_date('1990-12-19','yyyy-mm-dd')));
              insert into emp_tab5(eno,sal,job,emp5)
                      values(0022,9900,'dba',emp_type5('tom',to_date('1970-12-2','yyyy-mm-dd')));
            end;

            --比较数据
            declare
                type emp5_tab is table of  emp_type5;
                 v_emp5_tab emp5_tab;
                 v_result varchar2(100);
                begin
                   select emp5 bulk collect into v_emp5_tab from emp_tab5 ;
                    if v_emp5_tab(1).compare(v_emp5_tab(2))=1 then
                      v_result :=  v_emp5_tab(1).name ||' 比 '||v_emp5_tab(2).name ||'大';
                    else
                        v_result := v_emp5_tab(1).name ||' 比 '||v_emp5_tab(2).name ||'小';
                    end if;    
                    raise_application_error(-20201,v_result);
                end;

                      
          -- 6. 建立包含自定义对象类型的构造方法
           oracle 9i 开始可以自定义构造函数
            create or replace type emp_type6 as object(
                 name varchar2(10),birthdate date,
                constructor function emp_type6(name,varchar2) return self as result;
            );
           方法体的实现类同5
           
           
           ==========================================================================================
           《2》复杂对象类型
            1.嵌套对象类型:一个对象类型中嵌套另一个对象类型
               create or replace typed emp_addr_type7 as object(
                  addr varchar2(100)
               );   
            
              eg;
              create or replace typed emp_type7 as object(
                 name varchar2(10), emp_addr emp_addr_type7
              );
              
            2.参照对象类型:建立对象表时 使用ref 定义表列,ref实际是指向对象数据的逻辑指针。
             ........
             
             
             
           《3》查看对象类型
              1.查看对象类型
                select type_name ,final from user_types;
              2.修改对象类型
               alter type emp_type7 add atrribute addr varchar2(10) cascade;
               ...

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值