自定义对象

创建对象:
    CREATE [OR REPLACE] TYPE <对象名> AS OBJECT(
    属性1 类型
    属性2 类型
          .
           .
    方法1的规范(MEMBER PROCEDURE <过程名>
    方法2的规范 (MEMBER FUNCTION <函数名> RETURN 类型)
          .
           .
    PRAGMA RESTRIC_REFERENCES(<方法名>,WNDS/RNDS/WNPS/RNPS);

      关键字"PRAGMA RESTRIC_REFERENCES"通知ORACLE函数按以下模式之一操作;
      WNDS-不能写入数据库状态;
    
 RNDS-不能读出数据库状态;
    
 WNPS-不能写入包状态;
    
 RNDS-不能读出包状态;


    创建对象主体:
    
 CREATE [OR REPLACE] TYPE body <对象名> AS
     方法1的规范(MEMBER PROCEDURE <过程名> is   <PL/SQL块>
    方法2的规范 (MEMBER FUNCTION <函数名> RETURN 类型 is <PL/SQL块>  
     END;

使用MAP方法和ORDER方法

     用于对自定义类型排序。每个类型只有一个MAP或ORDER方法。
     格式:MAP MEMBER FUNCTION <函数名> RETURN 类型
            ORDER MEMBER FUNCTION <函数名> RETURN NUMBER

创建对象表
    
 CREATE TABLE <表名> OF <对象类型>

示例:
     1. 创建name 类型
     create or replace type name_type as object(
          f_name varchar2(20),
          l_name varchar2(20),
          map member function name_map return varchar2);

    
     create or replace type body name_type as
          map member function name_map return varchar2 is --对f_name和l_name排序
          begin
               return f_name||l_name;
          end;
          end;

    
 2 创建address 类型
     create or replace type address_type as object
    
  ( city varchar2(20),
    
      street varchar2(20),
    
      zip number,
    
 order member function address_order(other address_type) return number);

    
 create or replace type body address_type as
    
 order member function address_order(other address_type) return number is --对zip排序
    
 begin
    
      return self.zip-other.zip;
    
 end;
    
 end;

3 创建stu对象
    
  create or replace type stu_type as object (
    
  stu_id number(5),
    
  stu_name name_type,
    
  stu_addr address_type,
    
  age number(3),
    
  birth date,
    
  map member function stu_map return number,
    
 member procedure update_age);

    
 create or replace type body stu_type as
    
  map member function stu_map return number is --对stu_id排序
    
  begin
    
        return stu_id;
    
  end;
    
 member procedure update_age is --求年龄用现在时间-birth
    
  begin
    
        update student set age=to_char(sysdate,'yyyy')-to_char(birth,'yyyy') where stu_id=self.stu_id;
    
  end;
    
  end;
4. 创建对象表
    
 create table student of stu_type(primary key(stu_id));
5.向对象表插值
      insert into student values(1,name_type('关','羽'),address_type('武汉','成都路',43000), null,sysdate-365*20);
6.使用对象的方法
   
 delcare
   
      aa stu_type;
   
 begin
   
      select value(s) into aa from student s where stu_id=1; --value()将对象表的每一行转成行对象括号中必须为表的别名
   
      aa.update_age();
   
 end;
7.select stu_id,s.stu_name.f_name,s.stu_name.l_name from student s; --查看类型的值
8.select ref(s) from student s ; --ref()求出行对象的OID,括号中必须为表的别名;deref()将oid变成行队像;