对象表REF:oracle对象表和关系表区别和理解?(对象表中是否有数据?)

Kingore 2004-02-27 08:36:33
原文内容:
对象表和关系表不同,它不包含允许显示地与其他表相关的外码。ORACLE8不使用
外码而是使用对象标志符。对象表中的每一个行对象都创建一个对象标志符。
OID允许对象类型和关系表引用对象表中的行对象。引用机制通过使用ORACLE8的REF结构实现。REF结构允许对象类型直接引用对象表中的每一行。对象表内部不存储
行对象数据。相反,对象表包含含有行对象数据的外部表的指针或引用。

我的理解:
对象表只是抽象意义上的结构。具体数据还是存储在具体的关系表中。
比如有关系表PERSON,有两个列FIRSTNAME和SECONDNAME
定义对象类型
PERSON
{
FIRSTNAME VARCHAR(20),
SECONDNAME VARCHAR(20)
}
之后再创建对象表

之后对象表中包含关系表中行数据(行对象)的指针(或引用)[由REF结构实现]。
也就是说对象表只是抽象意义上的结构,不包含(存储)具体的数据,具体的数据
还是放在原来的关系表中,
所以叫关系-对象数据库?


以上是我的理解,感觉不是很对。
希望高手给予指点,讲讲你的理解。
小弟刚学,疑惑万分。
谢谢:)



...全文
446 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
oraclebeginner5 2004-03-23
理论是理论,真正在数据库里面对象很少用! 8i里面就不支持对象的继承,9i没用过

如果初学这些章节有个了解就行了,如果深究就当我没说呵,看的出来我是个水货
回复
xmlbeginner5 2004-03-23
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
回复
xmlbeginner5 2004-03-23
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 ;
回复
xmlbeginner5 2004-03-23
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 ;

回复
ddggggdd 2004-03-15
好东西,UP一下
回复
发帖
Oracle 高级技术
创建于2007-09-28

3405

社区成员

Oracle 高级技术相关讨论专区
申请成为版主
帖子事件
创建了帖子
2004-02-27 08:36
社区公告
暂无公告