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