Oracle8对象关系的设计与实现课件_第1页
Oracle8对象关系的设计与实现课件_第2页
Oracle8对象关系的设计与实现课件_第3页
Oracle8对象关系的设计与实现课件_第4页
Oracle8对象关系的设计与实现课件_第5页
已阅读5页,还剩139页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

综合实例定货系统综合实例定货系统1订货系统—

对象关系的设计与实现一、系统简介二、采用关系方法三、采用对象表四、采用对象视图订货系统—

对象关系的设计与实现一、系统简介一、系统简介系统涉及的实体和联系顾客表,Customer_Info货物表,Stock_Info订货单,purchase_info细目表Items_infoCustomer_Infopurchase_infoStock_Infoitems_infomn1mmn11一、系统简介系统涉及的实体和联系Customer_Infop顾客信息顾客表,Customer_Info顾客信息顾客表,Customer_Info货物信息货物表,Stock_Info货物信息货物表,Stock_Info定货信息订货单,purchase_info定货条目(细目表)items_info定货信息订货单,purchase_info二、采用关系方法关系表的定义对关系表的数据操纵基于关系表的查询与统计二、采用关系方法关系表的定义关系数据库的解决方案采用关系方法将顾客信息,订货单,货物条目清单组织成表。将地址拆成为基本元素,如省、市、街道、邮编等。设置顾客的一个可能拥有电话的最大限度,每一个电话表示为表的一列。关系方法将订货条目从订货单中分离出来,单独存放在一张表中,该表中有指向订货单表和货物表的外键。关系数据库的解决方案采用关系方法将顾客信息,订货单,货物条目关系表的定义采用关系模型实现对现实世界的抽象。将实体定义为关系(表)。实体间的联系通过外来码或关系表实现。表中的字段必须是不可分割的基本单位。不允许表中嵌表。通过表的连接实现多表查询。关系表的定义采用关系模型实现对现实世界的抽象。CREATETABLEcustomer_info( custno NUMBERPRIMARYKEY, custname VARCHAR2(200), street VARCHAR2(200), city VARCHAR2(200),stateVARCHAR2(200), zip VARCHAR2(6), phone1 VARCHAR2(20), phone2 VARCHAR2(20), phone3 VARCHAR2(20));建立顾客表CREATETABLEcustomer_info(建立建立货物表CREATETABLEstock_info( stockno NUMBERPRIMARYKEY, costNUMBER,tax_codeNUMBER);建立货物表CREATETABLEstock_info(CREATETABLEpurchase_info( pono NUMBERPRIMARYKEY, custno NUMBERREFERENCEScustomer_info(custno), orderdate DATE, shiptodate DATE, shiptostreet VARCHAR2(200), shiptocity VARCHAR2(200),shiptostateVARCHAR2(200), shiptozip VARCHAR2(20));建立定货表CREATETABLEpurchase_info(建立建立细目表CREATETABLEitems_info( lineitemnoNUMBER, ponoNUMBERREFERENCESpurchase_info(pono), stocknoNUMBERREFERENCESstock_info(stockno), quantity NUMBER, discount NUMBER, PRIMARYKEY(pono,lineitemno));建立细目表CREATETABLEitems_info(向关系表插入数据向顾客表插入数据INSERTINTOcustomer_infoVALUES(1,'JeanNance','2AvocetDrive',‘RedwoodShores','CA','95054','415-555-1212',NULL,NULL);INSERTINTOcustomer_infoVALUES(2,'JohnNike','323CollegeDrive','Edison','NJ','08820','609-555-1212','201-555-1212',NULL);向货物表插入数据INSERTINTOstock_infoVALUES(1004,6750.00,2);INSERTINTOstock_infoVALUES(1011,4500.23,2);INSERTINTOstock_infoVALUES(1534,2234.00,2);INSERTINTOstock_infoVALUES(1535,3456.23,2);向关系表插入数据向顾客表插入数据向关系表插入数据向定货单表插入数据

INSERTINTOpurchase_infoVALUES(1001,1,SYSDATE,‘10-5月-1997',NULL,NULL,NULL,NULL);INSERTINTOpurchase_infoVALUES(2001,2,SYSDATE,‘20-5月-1997','55MadisonAve','Madison','WI','53715');向定货单条目插入数据INSERTINTOitems_infoVALUES(01,1001,1534,12,0);INSERTINTOitems_infoVALUES(02,1001,1535,10,10);INSERTINTOitems_infoVALUES(10,2001,1004,1,0);INSERTINTOitems_infoVALUES(11,2001,1011,2,1);向关系表插入数据向定货单表插入数据关系表的查询查询订货单1001的顾客信息和订货详细信息(多表连接)SELECTC.custno,C.custname,C.street,C.city,C.state,C.zip,C.phone1,C.phone2,C.phone3,P.pono,P.orderdate,L.stockno,L.lineitemno,L.quantity,L.discountFROMcustomer_infoC,purchase_infoP,items_infoLWHEREC.custno=P.custnoANDP.pono=L.ponoANDP.pono=1001;关系表的查询查询订货单1001的顾客信息和订货详细信息关系表的查询SELECTP.pono,C.custname,P.orderdate,cursor(selectstockno,lineitemno,quantity,discountfromitems_infowherepono=p.pono)细目表见下FROMcustomer_infoC,purchase_infoPWHEREP.custno=C.custnoANDP.pono=2001关系表的查询SELECTP.pono,C.custna关系表的查询

PONOCUSTNAMEORDERDATE细目表见下-------------------------------------------------------------------2001JohnNike14-10月-00CURSOR…:4CURSORSTATEMENT:4STOCKNOLINEITEMNOQUANTITYDISCOUNT------------------------------------------------------------------1004101010111121关系表的查询PONOCUSTNAMEORDERDA数据操纵--查询数据统计每一个订货单的总价值SELECTL.pono,SUM(S.cost*L.quantity)FROMitems_infoL,stock_infoSWHEREL.stockno=S.stocknoGROUPBYL.pono;查询涉及货物1004的订货单及订货条目信息SELECTP.pono,P.custno,L.stockno,L.lineitemno,L.quantity,L.discountFROMpurchase_infoP,items_infoLWHEREP.pono=L.ponoANDL.stockno=1004;数据操纵--查询数据统计每一个订货单的总价值数据操纵--维护数据修改数据:更改1001订货单中货物号为1535的订货量UPDATEitems_infoSETquantity=20WHEREpono=1001ANDstockno=1535;删除数据:删除编号为1001的订货单DELETEFROMitems_info(先删细目表记录)WHEREpono=1001;DELETEFROMpurchase_info(再删主表记录)WHEREpono=1001;数据操纵--维护数据修改数据:三、采用对象表面向对象解决方案定义类型及类型体创建对象表对象表的数据操作三、采用对象表面向对象解决方案实现对象关系的方法O-R对象关系方法用户自定义数据类型使得复杂数据结构进入数据库模式中。不将address拆散,也不将联系电话存为不相关的多列,在O-R中可以定义特殊的类型表示。不将订货条目以单独表管理,O-R中将他们作为相应订货表的嵌套表。收集类型作为多值属性在O-R方法中,主要实体顾客,货物,订货单变为对象。对象引用表示他们之间n:1的关系,实现对象关系的方法O-R对象关系方法定义类型定货系统中的类型:地址address_t对象类型多个电话phone_list_t变长数组类型顾客customer_info_t对象类型货物stock_info_t对象类型货物条目line_item_t对象类型多个货物条目line_item_list_t嵌套表类型定货单purchase_info_t对象类型

定义类型定货系统中的类型:定义类型定义一个对象类型表示地址信息CREATETYPEaddress_tASOBJECT(streetVARCHAR2(200),cityVARCHAR2(200),stateCHAR(2),zipVARCHAR2(20));定义一个数组类型,表示顾客的几部电话CREATETYPEphone_list_tASVARRAY(10)OFVARCHAR2(20);定义类型定义一个对象类型表示地址信息定义类型定义一个对象类型表示定货条目信息CREATETYPEline_item_tASOBJECT(lineitemnoNUMBER,STOCKREFREFstock_info_t,quantityNUMBER,discountNUMBER);定义一个嵌套表类型,表示定货单中的货物条目信息CREATETYPEline_item_list_tASTABLEOFline_item_t;定义类型定义一个对象类型表示定货条目信息定义类型定义一个对象类型表示顾客CREATETYPEcustomer_info_tASOBJECT(custnoNUMBER,custnameVARCHAR2(200),addressaddress_t,phone_listphone_list_t,ORDERMEMBERFUNCTIONcust_order(xINcustomer_info_t)RETURNINTEGER,PRAGMARESTRICT_REFERENCES(cust_order,WNDS,WNPS,RNPS,RNDS));定义类型定义一个对象类型表示顾客定义类型定义一个对象类型表示货物信息CREATETYPEstock_info_tASOBJECT(stocknoNUMBER,costNUMBER,tax_codeNUMBER);定义类型定义一个对象类型表示货物信息定义类型定义一个对象类型表示定货单CREATETYPEpurchase_info_tASOBJECT(ponoNUMBER,custrefREFcustomer_info_t,orderdateDATE,shipdateDATE,line_item_listline_item_list_t,shiptoaddraddress_t,MAPMEMBERFUNCTIONret_valueRETURNNUMBER,PRAGMARESTRICT_REFERENCES(ret_value,WNDS,WNPS,RNPS,RNDS),MEMBERFUNCTIONtotal_valueRETURNNUMBER,PRAGMARESTRICT_REFERENCES(total_value,WNDS,WNPS));定义类型定义一个对象类型表示定货单嵌套表和可变数组的比较对顾客中的电话来说VARRAY的元素是有序的VARRAY要求预置元素数目对定货单中的货物条目来说嵌套表没有上界的限制嵌套表可以直接做查询可以对嵌套表做索引嵌套表和可变数组的比较对顾客中的电话来说定义方法定义customer_info_t对象类型的方法:CREATEORREPLACETYPEBODYcustomer_info_tASORDERMEMBERFUNCTIONcust_order(xINcustomer_info_t)RETURNINTEGERISBEGINRETURNcustno-x.custno;END;END;顾客对象的比较是顾客号的比较定义方法定义customer_info_t对象类型的方法:顾定义方法定义purchase_info_t对象类型的方法:CREATEORREPLACETYPEBODYpurchase_info_tASMAPMEMBERFUNCTIONret_valueRETURNNUMBERIS BEGIN RETURNpono; END; 定义方法定义purchase_info_t对象类型的方法:定义方法MEMBERFUNCTIONtotal_valueRETURNNUMBERISiINTEGER; stockstock_info_t;--(stockno,cost,tax_code) line_itemline_item_t;--(lineitemnoSTOCKREFquantitydiscount) totalNUMBER:=0;BEGINFORiIN1..SELF.line_item_list.COUNTLOOPline_item:=SELF.line_item_list(i);SELECTDEREF(line_item.stockref)INTOstockFROMDUAL;total:=total+line_item.quantity*stock.cost;ENDLOOP;RETURNtotal;END;END;定义方法MEMBERFUNCTIONtotal_va创建对象表一般来讲,可以按下面规则理解“对象”和“表”之间的关系:类,即客观世界的实体,对应于表对象属性对应于表的列对象对应于表的记录每一个表是一个隐式的类,它的对象(记录)都有相同的属性(列)创建对象表一般来讲,可以按下面规则理解“对象”和“表”之间的创建对象表定义对象表customer_tabCREATETABLEcustomer_tabOFcustomer_info_t(custnoPRIMARYKEY);对象类型包含四个属性: custnoNUMBER custnameVARCHAR2(200) addressaddress_t phone_listphone_list_t创建对象表定义对象表customer_tab创建对象表对象类型作为创建对象表的模板约束用于表上,不能定义在类型上(如PRIMARYKEY的约束定义)表可以包含对象列,由于变长数组phone_list_t包含的数量少于10x20,所以ORACLE将其作为一个存储单元,当超过4000byte时,将以BLOB类型存于表外不为对象类型分配存储空间,仅为表分配记录空间创建对象表对象类型作为创建对象表的模板创建对象表对象表stock_tab的定义:CREATETABLEstock_tabOFstock_info_t(stocknoPRIMARYKEY);STOCK_INFO_T对象类型包含三个属性:stocknoNUMBER,costNUMBER,tax_codeNUMBER创建对象表对象表stock_tab的定义:创建对象表对象表purchase_tab的定义:CREATETABLEpurchase_tabOFpurchase_info_t(PRIMARYKEY(pono),SCOPEFOR(custref)IScustomer_tab)NESTEDTABLEline_item_listSTOREASpo_line_tab;purchase_info_T对象类型的属性包括:ponoNUMBER,custrefREFcustomer_info_t,orderdateDATE,shipdateDATE,line_item_listline_item_list_t,shiptoaddraddress_t创建对象表对象表purchase_tab的定义:创建对象表REF操作符:如果未作限制,REF允许引用任意类型为customer_info_t表的行对象。SCOPE约束只是限制purchase_tab对象表的custref列的取值范围。嵌套表:十分适合于表示表间的主从关系,从而可以避免DML中的关系联接(JOIN)。一个嵌套表的所有记录存储在一个独立的存储表中,在该存储表中有一个隐含的列NESTED_TABLE_ID与相应的父表记录相对应,在嵌套表中的记录与父表中的记录根据NESTED_TABLE_ID对应。嵌套表类型的各个属性对应于存储表的各列。创建对象表REF操作符:维护嵌套表修改嵌套表的存储表ALTERTABLEpo_line_tabADD(SCOPEFOR(stockref)ISstock_tab);ALTERTABLEpo_line_tabSTORAGE(NEXT5KPCTINCREASE5MINEXTENTS1MAXEXTENTS20);维护嵌套表修改嵌套表的存储表插入stock_tab数据INSERTINTOstock_tabVALUES(1004,6750.00,2);INSERTINTOstock_tabVALUES(1011,4500.23,2);INSERTINTOstock_tabVALUES(1534,2234.00,2);INSERTINTOstock_tabVALUES(1535,3456.23,2);向对象表插入数据向对象表插入数据插入customer_tab数据INSERTINTOcustomer_tabVALUES(1,`JeanNance',address_t(`2AvocetDrive',`RedwoodShores',`CA',`95054'),phone_list_t(`415-555-1212'));INSERTINTOcustomer_tabVALUES(2,`JohnNike',address_t(`323CollegeDrive',`Edison',`NJ',`08820'),phone_list_t(`609-555-1212',`201-555-1212'));向对象表插入数据插入customer_tab数据向对象表插入数据向对象表插入数据插入purchase_tab数据INSERTINTOpurchase_tabSELECT1001,REF(C),SYSDATE,'10-MAY-1997',line_item_list_t(),NULLFROMcustomer_tabCWHEREC.custno=1;上面的语句用下列属性创建了一个purchase_info_T对象:pono=1001 custref=对于顾客1的引用orderdate=SYSDATE shipdate=10-MAY-1997line_item_list=一个空的货物列表shiptoaddr=NULL向对象表插入数据插入purchase_tab数据向嵌套表插入数据INSERTINTOTHE(SELECTP.line_item_listFROMpurchase_tabPWHEREP.pono=1001)SELECT01,REF(S),12,0FROMstock_tabSWHERES.stockno=1534;INSERTINTOTHE(SELECTP.line_item_listFROMpurchase_tabPWHEREP.pono=1001)SELECT02,REF(S),10,10FROMstock_tabSWHERES.stockno=1535;向嵌套表插入数据INSERTINTOTHE(SEL向对象表插入数据INSERTINTOpurchase_tabSELECT2001,REF(C),SYSDATE,'20-MAY-1997',line_item_list_t(),address_t(`55Madisonve','Madison','WI','53715')FROMcustomer_tabCWHEREC.custno=2;向对象表插入数据INSERTINTOpurchase_向嵌套表插入数据INSERTINTOTHE(SELECTP.line_item_listFROMpurchase_tabPWHEREP.pono=2001)SELECT10,REF(S),1,0FROMstock_tabSWHERES.stockno=1004;INSERTINTOTHE(SELECTP.line_item_listFROMpurchase_tabPWHEREP.pono=2001)VALUES(line_item_t(11,NULL,2,1));向嵌套表插入数据INSERTINTOTHE(SEL修改嵌套表修改定单表中单号为2001记录的嵌套表,将条目号为11的货物指针指向1011号货物UPDATETHE(SELECTP.line_item_list FROMpurchase_tabP WHEREP.pono=2001)plistSETplist.stockref=(SELECTREF(S) FROMstock_tabS WHERES.stockno=1011)WHEREplist.lineitemno=11;修改嵌套表修改定单表中单号为2001记录的嵌套表,将条目号为使用排序方法排序方法的引用SELECTp.ponoFROMpurchase_tabpORDERBYVALUE(p);按purchase_tab对象大小比较,隐含调用:MAPMEMBERFUNCTIONret_valueRETURNNUMBERISBEGINRETURNpono;END;相当于orderbypono使用排序方法排序方法的引用数据操纵--查询数据查询订货单1001的顾客信息和订货详细信息SELECTDEREF(p.custref),p.shiptoaddr,p.pono,p.orderdate,line_item_listFROMpurchase_tabpWHEREp.pono=1001;每一个订货单的总价值SELECTp.pono,p.total_value()FROMpurchase_tabp;数据操纵--查询数据查询订货单1001的顾客信息和订货详数据操纵--查询数据查询定货单及涉及货物1004定货条目的信息。SELECTpo.pono,po.custref.custno,CURSOR(SELECT*FROMTABLE(po.line_item_list)LWHEREL.stockref.stockno=1004)FROMpurchase_tabpo;数据操纵--查询数据查询定货单及涉及货物1004定货条目的数据操纵--删除数据在下面的删除例子中,Oracle自动删除所有属于订货单的货物条目,而在原关系模型中必须要考虑到两张表的删除问题。删除订货单1001:DELETE FROMpurchase_tabWHEREpono=1001;数据操纵--删除数据在下面的删除例子中,Oracle自动删除四、采用对象视图对象视图解决方案(基于关系表)定义对象视图对象视图的查询使用触发器更新对象视图四、采用对象视图对象视图解决方案(基于关系表)对象视图解决方案对象视图是虚拟对象表,数据源取自表和视图。采用对象表实现系统设计一般采用如下步骤建立实体和关系通过创建和填充关系表实现实体关系结构采用UDT表示对象关系模式,模型化一个实体关系结构采用O-R模式创建和填充对象表实现实体关系结构采用对象视图方式要使用相同的初始步骤,但最后一步有所不同,它不是通过创建和填充对象表的方式,而是使用对象视图来表示虚拟对象表,数据取自一般的关系表对象视图解决方案对象视图是虚拟对象表,数据源取自表和视图。定义对象视图三个对象视图:Customer_view,Stock_view,Purchase_view。创建对象视图的语句有四个部分:视图的名字视图所基于的对象类型的名字基于主码创建对象标识OID)一个选择语句根据对应的对象类型向虚拟对象表中填充数据后面例子借用前面的几个类型定义定义对象视图三个对象视图:定义对象视图Customer_view对象视图:CREATEORREPLACEVIEWcustomer_viewOFcustomer_info_tWITHOBJECTOID(custno)ASSELECTC.custno,C.custname,address_t(C.street,C.city,C.state,C.zip),phone_list_t(C.phone1,C.phone2,C.phone3)FROMcustomer_infoC;定义对象视图Customer_view对象视图:定义对象视图Stock_view对象视图CREATEORREPLACEVIEWstock_viewOFstock_info_t WITHOBJECTOID(stockno)AS SELECT*FROMstock_info;定义对象视图Stock_view对象视图定义对象视图Purchase_view对象视图CREATEORREPLACEVIEWpurchase_viewOFpurchase_info_tWITHOBJECTOID(pono)ASSELECTP.pono,,P.orderdate,P.shiptodate,,address_t(P.shiptostreet,P.shiptocity,P.shiptostate,P.shiptozip)FROMpurchase_infoP;客户对象引用嵌套表列定义对象视图Purchase_view对象视图客户对象引用嵌构造视图的对象引用列MAKE_REF(customer_view,P.custno),MAKE_REF(对象表/视图,定位记录的主键值)返回指向对象表/视图的一个对象(记录)的REF客户对象引用构造视图的对象引用列客户对象引用构造视图的嵌套表列CAST(MULTISET(SELECTline_item_t(L.lineitemno,MAKE_REF(stock_view,L.stockno),L.quantity,L.discount)FROMitems_infoLWHEREL.pono=P.pono)ASline_item_list_t),嵌套表列构造视图的嵌套表列CAST(嵌套表列定义对象视图purchase_info_t对象类型有如下属性:

pono NUMBERcustref REFcustomer_info_torderdate DATEshipdate DATEline_item_listline_item_list_tshiptoaddr address_t定义对象视图purchase_info_t对象类型有如下属使用对象视图--查询数据查询订货单1001的顾客信息和订货详细信息SELECTDEREF(p.custref),p.shiptoaddr,p.pono,p.orderdate,line_item_listFROMpurchase_viewpWHEREp.pono=1001;统计每一个订货单的总价值SELECTp.pono,p.total_value()FROMpurchase_viewp;使用对象视图--查询数据查询订货单1001的顾客信息和订使用对象视图--查询数据查询定货单及涉及货物1004定货条目的信息。SELECTpo.pono,po.custref.custno,

CURSOR(SELECT*FROMTABLE(po.line_item_list)LWHEREL.stockref.stockno=1004)FROMpurchase_viewpo;使用对象视图--查询数据查询定货单及涉及货物1004定货使用触发器更新对象视图Oracle提供INSTEADOF触发器可作为更新复杂对象视图的方法。每当想要改变对象视图中行对象的属性值时,Oracle执行对象视图的INSTEADOF触发器在触发器中,Oracle使用关键字:OLD和:NEW存取行对象的当前值和新值。使用触发器更新对象视图Oracle提供INSTEADOF触使用触发器更新对象视图Stock_view的INSTEADOF触发器CREATEORREPLACETRIGGERstockview_insert_trINSTEADOFINSERTONstock_viewFOREACHROWBEGININSERTINTOstock_infoVALUES(:NEW.stockno,:NEW.cost,:NEW.tax_code);END;

使用触发器更新对象视图Stock_view的INSTEAD使用触发器更新对象视图Customer_view的INSTEADOF触发器CREATEORREPLACETRIGGERcustview_insert_trINSTEADOFINSERTONcustomer_viewFOREACHROWDECLAREphonesphone_list_t;tphone1customer_info.phone1%TYPE:=NULL;tphone2customer_info.phone2%TYPE:=NULL;tphone3customer_info.phone3%TYPE:=NULL;使用触发器更新对象视图Customer_view的INST使用触发器更新对象视图BEGINphones:=:NEW.phone_list;IFphones.COUNT>2THENtphone3:=phones(3);ENDIF;IFphones.COUNT>1THENtphone2:=phones(2);ENDIF;IFphones.COUNT>0THENtphone1:=phones(1);ENDIF;使用触发器更新对象视图BEGIN使用触发器更新对象视图INSERTINTOcustomer_infoVALUES(:NEW.custno,:NEW.custname,:NEW.address.street,:NEW.address.city,:NEW.address.state,:NEW.address.zip,tphone1,tphone2,tphone3);END;使用触发器更新对象视图INSERTINTOcust向对象视图插入数据下列语句激活了customer_view触发器:INSERTINTOcustomer_viewVALUES(13,`EllanWhite',address_t(`25IStreet',`Memphis',`TN',`05456'),phone_list_t(`615-555-1212'));向对象视图插入数据下列语句激活了customer_view触使用触发器更新对象视图Purchase_view的INSTEADOF触发器CREATEORREPLACETRIGGERpoview_insert_trINSTEADOFINSERTONpurchase_viewFOREACHROWDECLAREline_itmsline_item_list_t;iINTEGER;custvarcustomer_info_t;stockvarstock_info_t;stockvartempREFstock_info_t;使用触发器更新对象视图Purchase_view的INSTE使用触发器更新对象视图BEGINline_itms:=:NEW.line_item_list;SELECTDEREF(:NEW.custref)INTOcustvarFROMDUAL;INSERTINTOpurchase_infoVALUES(:NEW.pono,custvar.custno,:NEW.orderdate,:NEW.shipdate,:NEW.shiptoaddr.street,:NEW.shiptoaddr.city,:NEW.shiptoaddr.state,:NEW.shiptoaddr.zip);向定货单表插入数据使用触发器更新对象视图BEGIN向定货单表插入数据使用触发器更新对象视图FORiIN1..line_itms.COUNTLOOPstockvartemp:=line_itms(i).stockref; SELECTDEREF(stockvartemp)INTOstockvarFROMDUAL; INSERTINTOitems_infoVALUES(line_itms(i).lineitemno,:NEW.pono,stockvar.stockno,line_itms(i).quantity,line_itms(i).discount);ENDLOOP;END;向定货条目表插入数据使用触发器更新对象视图FORiIN1..line_it向对象视图插入数据下列语句激活了purchase_view触发器:INSERTINTOpurchase_viewSELECT3001,REF(c),SYSDATE,SYSDATE,CAST(MULTISET(SELECTline_item_t(41,REF(S),20,1)FROMstock_viewSWHERES.stockno=1535)ASline_item_list_t),address_t(`22NothingameAve',‘Cockstown','AZ','44045')FROMcustomer_viewcWHEREc.custno=1向对象视图插入数据下列语句激活了purchase_view触查询对象视图查询订货单1001的顾客信息和订货详细信息SELECTDEREF(p.custref),p.shiptoaddr,p.pono, p.orderdate,line_item_list FROMpurchase_viewpWHEREp.pono=1001;每一个订货单的总价值SELECTp.pono,p.total_value() FROMpurchase_viewp;涉及货物1004的订货单及订货条目信息SELECTpo.pono,po.custref.custno,CURSOR(SELECT*FROMTABLE(po.line_item_list)LWHEREL.stockref.stockno=1004)FROMpurchase_viewpo;查询对象视图查询订货单1001的顾客信息和订货详细信息综合实例定货系统综合实例定货系统73订货系统—

对象关系的设计与实现一、系统简介二、采用关系方法三、采用对象表四、采用对象视图订货系统—

对象关系的设计与实现一、系统简介一、系统简介系统涉及的实体和联系顾客表,Customer_Info货物表,Stock_Info订货单,purchase_info细目表Items_infoCustomer_Infopurchase_infoStock_Infoitems_infomn1mmn11一、系统简介系统涉及的实体和联系Customer_Infop顾客信息顾客表,Customer_Info顾客信息顾客表,Customer_Info货物信息货物表,Stock_Info货物信息货物表,Stock_Info定货信息订货单,purchase_info定货条目(细目表)items_info定货信息订货单,purchase_info二、采用关系方法关系表的定义对关系表的数据操纵基于关系表的查询与统计二、采用关系方法关系表的定义关系数据库的解决方案采用关系方法将顾客信息,订货单,货物条目清单组织成表。将地址拆成为基本元素,如省、市、街道、邮编等。设置顾客的一个可能拥有电话的最大限度,每一个电话表示为表的一列。关系方法将订货条目从订货单中分离出来,单独存放在一张表中,该表中有指向订货单表和货物表的外键。关系数据库的解决方案采用关系方法将顾客信息,订货单,货物条目关系表的定义采用关系模型实现对现实世界的抽象。将实体定义为关系(表)。实体间的联系通过外来码或关系表实现。表中的字段必须是不可分割的基本单位。不允许表中嵌表。通过表的连接实现多表查询。关系表的定义采用关系模型实现对现实世界的抽象。CREATETABLEcustomer_info( custno NUMBERPRIMARYKEY, custname VARCHAR2(200), street VARCHAR2(200), city VARCHAR2(200),stateVARCHAR2(200), zip VARCHAR2(6), phone1 VARCHAR2(20), phone2 VARCHAR2(20), phone3 VARCHAR2(20));建立顾客表CREATETABLEcustomer_info(建立建立货物表CREATETABLEstock_info( stockno NUMBERPRIMARYKEY, costNUMBER,tax_codeNUMBER);建立货物表CREATETABLEstock_info(CREATETABLEpurchase_info( pono NUMBERPRIMARYKEY, custno NUMBERREFERENCEScustomer_info(custno), orderdate DATE, shiptodate DATE, shiptostreet VARCHAR2(200), shiptocity VARCHAR2(200),shiptostateVARCHAR2(200), shiptozip VARCHAR2(20));建立定货表CREATETABLEpurchase_info(建立建立细目表CREATETABLEitems_info( lineitemnoNUMBER, ponoNUMBERREFERENCESpurchase_info(pono), stocknoNUMBERREFERENCESstock_info(stockno), quantity NUMBER, discount NUMBER, PRIMARYKEY(pono,lineitemno));建立细目表CREATETABLEitems_info(向关系表插入数据向顾客表插入数据INSERTINTOcustomer_infoVALUES(1,'JeanNance','2AvocetDrive',‘RedwoodShores','CA','95054','415-555-1212',NULL,NULL);INSERTINTOcustomer_infoVALUES(2,'JohnNike','323CollegeDrive','Edison','NJ','08820','609-555-1212','201-555-1212',NULL);向货物表插入数据INSERTINTOstock_infoVALUES(1004,6750.00,2);INSERTINTOstock_infoVALUES(1011,4500.23,2);INSERTINTOstock_infoVALUES(1534,2234.00,2);INSERTINTOstock_infoVALUES(1535,3456.23,2);向关系表插入数据向顾客表插入数据向关系表插入数据向定货单表插入数据

INSERTINTOpurchase_infoVALUES(1001,1,SYSDATE,‘10-5月-1997',NULL,NULL,NULL,NULL);INSERTINTOpurchase_infoVALUES(2001,2,SYSDATE,‘20-5月-1997','55MadisonAve','Madison','WI','53715');向定货单条目插入数据INSERTINTOitems_infoVALUES(01,1001,1534,12,0);INSERTINTOitems_infoVALUES(02,1001,1535,10,10);INSERTINTOitems_infoVALUES(10,2001,1004,1,0);INSERTINTOitems_infoVALUES(11,2001,1011,2,1);向关系表插入数据向定货单表插入数据关系表的查询查询订货单1001的顾客信息和订货详细信息(多表连接)SELECTC.custno,C.custname,C.street,C.city,C.state,C.zip,C.phone1,C.phone2,C.phone3,P.pono,P.orderdate,L.stockno,L.lineitemno,L.quantity,L.discountFROMcustomer_infoC,purchase_infoP,items_infoLWHEREC.custno=P.custnoANDP.pono=L.ponoANDP.pono=1001;关系表的查询查询订货单1001的顾客信息和订货详细信息关系表的查询SELECTP.pono,C.custname,P.orderdate,cursor(selectstockno,lineitemno,quantity,discountfromitems_infowherepono=p.pono)细目表见下FROMcustomer_infoC,purchase_infoPWHEREP.custno=C.custnoANDP.pono=2001关系表的查询SELECTP.pono,C.custna关系表的查询

PONOCUSTNAMEORDERDATE细目表见下-------------------------------------------------------------------2001JohnNike14-10月-00CURSOR…:4CURSORSTATEMENT:4STOCKNOLINEITEMNOQUANTITYDISCOUNT------------------------------------------------------------------1004101010111121关系表的查询PONOCUSTNAMEORDERDA数据操纵--查询数据统计每一个订货单的总价值SELECTL.pono,SUM(S.cost*L.quantity)FROMitems_infoL,stock_infoSWHEREL.stockno=S.stocknoGROUPBYL.pono;查询涉及货物1004的订货单及订货条目信息SELECTP.pono,P.custno,L.stockno,L.lineitemno,L.quantity,L.discountFROMpurchase_infoP,items_infoLWHEREP.pono=L.ponoANDL.stockno=1004;数据操纵--查询数据统计每一个订货单的总价值数据操纵--维护数据修改数据:更改1001订货单中货物号为1535的订货量UPDATEitems_infoSETquantity=20WHEREpono=1001ANDstockno=1535;删除数据:删除编号为1001的订货单DELETEFROMitems_info(先删细目表记录)WHEREpono=1001;DELETEFROMpurchase_info(再删主表记录)WHEREpono=1001;数据操纵--维护数据修改数据:三、采用对象表面向对象解决方案定义类型及类型体创建对象表对象表的数据操作三、采用对象表面向对象解决方案实现对象关系的方法O-R对象关系方法用户自定义数据类型使得复杂数据结构进入数据库模式中。不将address拆散,也不将联系电话存为不相关的多列,在O-R中可以定义特殊的类型表示。不将订货条目以单独表管理,O-R中将他们作为相应订货表的嵌套表。收集类型作为多值属性在O-R方法中,主要实体顾客,货物,订货单变为对象。对象引用表示他们之间n:1的关系,实现对象关系的方法O-R对象关系方法定义类型定货系统中的类型:地址address_t对象类型多个电话phone_list_t变长数组类型顾客customer_info_t对象类型货物stock_info_t对象类型货物条目line_item_t对象类型多个货物条目line_item_list_t嵌套表类型定货单purchase_info_t对象类型

定义类型定货系统中的类型:定义类型定义一个对象类型表示地址信息CREATETYPEaddress_tASOBJECT(streetVARCHAR2(200),cityVARCHAR2(200),stateCHAR(2),zipVARCHAR2(20));定义一个数组类型,表示顾客的几部电话CREATETYPEphone_list_tASVARRAY(10)OFVARCHAR2(20);定义类型定义一个对象类型表示地址信息定义类型定义一个对象类型表示定货条目信息CREATETYPEline_item_tASOBJECT(lineitemnoNUMBER,STOCKREFREFstock_info_t,quantityNUMBER,discountNUMBER);定义一个嵌套表类型,表示定货单中的货物条目信息CREATETYPEline_item_list_tASTABLEOFline_item_t;定义类型定义一个对象类型表示定货条目信息定义类型定义一个对象类型表示顾客CREATETYPEcustomer_info_tASOBJECT(custnoNUMBER,custnameVARCHAR2(200),addressaddress_t,phone_listphone_list_t,ORDERMEMBERFUNCTIONcust_order(xINcustomer_info_t)RETURNINTEGER,PRAGMARESTRICT_REFERENCES(cust_order,WNDS,WNPS,RNPS,RNDS));定义类型定义一个对象类型表示顾客定义类型定义一个对象类型表示货物信息CREATETYPEstock_info_tASOBJECT(stocknoNUMBER,costNUMBER,tax_codeNUMBER);定义类型定义一个对象类型表示货物信息定义类型定义一个对象类型表示定货单CREATETYPEpurchase_info_tASOBJECT(ponoNUMBER,custrefREFcustomer_info_t,orderdateDATE,shipdateDATE,line_item_listline_item_list_t,shiptoaddraddress_t,MAPMEMBERFUNCT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论