原文内容:
   对象表和关系表不同,它不包含允许显示地与其他表相关的外码。ORACLE8不使用
外码而是使用对象标志符。对象表中的每一个行对象都创建一个对象标志符。
   OID允许对象类型和关系表引用对象表中的行对象。引用机制通过使用ORACLE8的REF结构实现。REF结构允许对象类型直接引用对象表中的每一行。对象表内部不存储
行对象数据。相反,对象表包含含有行对象数据的外部表的指针或引用。我的理解:
   对象表只是抽象意义上的结构。具体数据还是存储在具体的关系表中。
比如有关系表PERSON,有两个列FIRSTNAME和SECONDNAME
定义对象类型
PERSON
{
FIRSTNAME VARCHAR(20),
SECONDNAME VARCHAR(20)
}
之后再创建对象表之后对象表中包含关系表中行数据(行对象)的指针(或引用)[由REF结构实现]。
也就是说对象表只是抽象意义上的结构,不包含(存储)具体的数据,具体的数据
还是放在原来的关系表中,
所以叫关系-对象数据库?
以上是我的理解,感觉不是很对。
希望高手给予指点,讲讲你的理解。
小弟刚学,疑惑万分。
谢谢:)

解决方案 »

  1.   

    1.概念
    方法:是在对象类型说明中用关键字 MEMBER 声明的子程序 
    i方法是作为对象类型定义组成部分的一个过程或函数 
    i方法不能与对象类型或其任何属性同名 
    i与数据包程序相似,大多数方法有两个部分CREATE [OR REPLACE] TYPE <typename> AS OBJECT(attribute1 datatype, : attributeN datatypeMEMBER PROCEDURE <methodname> (parameter, mode, datatype),MEMBER FUNCTION <methodname> (parameter, mode, datatype) RETURN datatype,PRAGMA RESTRICT_REFERENCES (<methodname>,WNDS/RNDS/WNPS/RNPS));
    说明:PRAGMA RESTRICT_REFERENCES指定MEMBER方法按以下模式之一
    操作: –WNDS (不能写入数据库状态) i不能修改数据库 
    –RNDS (不能读出数据库状态) i不能执行查询 
    –WNPS (不能写入数据包状态) i不能更改数据包变量的值 
    –RNPS (不能读出数据包状态) i不能引用数据包变量的值 
    例:create or replace type FLIGHT_SCH_TYPE as object(FLIGHTNO VARCHAR2(4) , AIRBUSNO VARCHAR2(5) , ROUTE_CODE VARCHAR2(7) , DEPRT_TIME VARCHAR2(10) , JOURNEY_HURS VARCHAR2(10) , FLIGHT_DAY1 NUMBER(1) , FLIGHT_DAY2 NUMBER(1) , Member function DAYS_FN(FLIGHT_DAY1 in number) return varchar2 , Pragma restrict_references(DAYS_FN , WNDS)) ;2.创建对象类型方法主体CREATE [OR REPLACE] TYPE BODY <typename> ASMEMBER FUNCTION <methodname> (parameter dataype) RETURN <datatype> IS<PL/SQL_block>;MEMBER PROCEDURE <methodname>(parameter datatype);END;
    例:create or replace type body FLIGHT_SCH_TYPE as  member function DAYS_FN(FLIGHT_DAY1 in number) return varchar2  is    disp_day varchar2(20) ;  begin      if flight_day1 = 1 then      disp_day := 'Sunday' ;      elsif flight_day1 = 2 then      disp_day := 'Monday' ;      elsif flight_day1 = 3 then      disp_day := 'Tuesday' ;      elsif flight_day1 = 4 then      disp_day := 'Wednesday' ;      elsif flight_day1 = 5 then      disp_day := 'Thursday' ;      elsif flight_day1 = 6 then      disp_day := 'Friday ' ;      elsif flight_day1 = 7 then      disp_day := 'Saturday' ;    end if ;        return disp_day ;  end ;end ;
      

  2.   

    3.调用对象方法基于类型创建表后,就可以在查询中调用对象方法A. 创建基于对象的表语法:create table <表名> of <对象类型>意义:此表具有该类型和member方法的所有属性,我们不能通过DBA STUDIO的表数据编辑器来编辑数据。例:create table FLIGHT_SCH_TAB of FLIGHT_SCH_TYPEinsert into FLIGHT_SCH_TAB  values('SL36','AB02','SAN-LOU','5','13:30',3,6);B.访问对象表中的MEMBER方法SELECT <columnname>, <aliasname>.<methodname(parameters)>FROM <tablename> <aliasname>;例:select flightno , rout_code , f.days.fn(flight_day1) as FLIGHTDAYfrom FLIGHT_SCH_TAB f ;C.关系表中的字段为对象类型create table FLIGHT_SCH_TABS(FLIGHT_DET FLIGHT_SCH_TYPE ,  FLIGHT_DESC varchar2(20)) ;注:插入数据,对于对象类型的字段的值,需要通过构造函数来得到。对象类型名称(成员1,..成员n)例:insert into FLIGHT_SCH_TABS  values(FLIGHT_SCH_TYPE('SL36','AB02','SAN-LOU','5','13:30',3,6),'DESC1');D.访问关系表中的Member方法此处的关系表:指表中有字段为对象类型SELECT <columnname>, <aliasname>.<columnname>.<methodname (parameters)>FROM <tablename> <aliasname>;例:select f.flight_det.FLIGHTNO ,   f.flight_det.ROUTE_CODE ,   f.flight_det.DAYS_FN(f.flight_det.FLIGHT_DAY1) FLIGHTDAYfrom flight_sch_tabs f ;
      

  3.   

    1. 声明简单类型(见PLSQL第五章教案)内容包括:A 对象类型的创建B.基于对象的表的创建 插入与访问C 关系对象表的创建 插入与访问2. 通过value运算符访问基于类型的表select value(<aliasname>  From <objecttable> <aliasname>例:select value(A) FROM FLIGHT_SCH_TAB A ;--返回的是对象区别select * from FLIGHT_SCH_TAB;--返回的是单个的值3. REF 运算符使您可以引用对象表中现有行的 OID 值 REF 运算符将表别名作为输入,并且为行对象返回 OID
     语法:select REF(<aliasname>) from <objecttable> <aliasname>例:select ref(a) from FLIGHT_SCH_TAB a ;注:FLIGHT_SCH_TAB 是基于对象的表4.声明复合类型CREATE TYPE name_typeAS OBJECT(name VARCHAR2(20), address address_type);
    5.定义对象之间的关系也是通过关键字REF,前面我们能过REF查询了基于对象的表中的对象的OID值,这里我们讲REF的另一个用途,即通过REF来定义对象之间的关系
    i称为引用的 REF 允许您创建行对象指针
    i它将创建对被引用对象位置的引用i该指针用于查询、更新或删除对象iREF 由目标对象的 OID、数据库标识符(列)和对象表构成iOID 用于创建使用 REF 和 DEREF 运算符的外键列的关系
    iSQL 和 PL/SQL 语句必须使用 REF 函数来处理对象引用 
    可按如下步骤关联两个表1. 创建对象类型,下面我们会创建另一个表,这个表的一个字段的类型为此类型create or replace type type_class as object(  classid varchar2(10) ,  classname varchar2(10))/2. 创建基于此类型的表create  table tbl_type_class of type_class  3. 创建具有外键列的关系表,有一个外键将引用1中定义的类型,并且该外键的值在2中已有的数据已经存在create table tbl_student_ref(  stuid varchar2(20) ,  stuname varchar2(20) ,  age number(10) ,  grade ref type_class scope is tbl_type_class)4. 将数据插入到对象表中begin  insert into tbl_type_class values('gid1' , 'gname1') ;   insert into tbl_type_class values('gid2' , 'gname2') ;  commit ;end ;/5. 将数据插入到关系对象表中,必须从上面创建的对象表中引用数据; insert into tbl_student_ref  select   'stuid1', 'stuname1',20,ref(a)    from tbl_type_class a    where classid='gid1'注:下面的方法是不行的!insert into tbl_student_ref values(  'stuid2',  'stuname2',  20,  select ref(a) from tbl_type_class a where classid='gid1' )/6. 服从值若要查看引用的值,则需要使用DEREF运算符i语法SELECT DEREF(<列名>.<列名>)FROM <表名> <别名>;例:select deref(grade) from tbl_student_ref