oop.docx
- 文档编号:30720056
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:17
- 大小:18.65KB
oop.docx
《oop.docx》由会员分享,可在线阅读,更多相关《oop.docx(17页珍藏版)》请在冰豆网上搜索。
oop
Oracle中的OOP概念:
对象类型,可变数组,嵌套表,对象表,对象视图
对象类型:
优点:
1)更容易与Java,C++编写的对象应用程序交互
2)获取便捷。
一次对象类型请求就可以从多个关系表中获取信息,通过一次网络往复即可返回
语法:
CREATE[ORREPLACE]TYPEtype_name
{{AS|IS}OBJECT|UNDERsuper_type}
{
attribute_namedatatype[,attribute_namedatatype]…---成员变量
[{MAP|ORDER}MEMBERfunction_name,]---排序函数
[{FINAL|NOTFINAL}MEMBERfunction_name,]---可否继承的成员函数
[{INSTANTIABLE|NOTINSTANTIABLE}MEMBERfunction_name,]---可否实例化的成员函数
[{MEMBER|STATIC}function_name,]---静态、非静态成员函数
}
[{FINAL|NOTFINAL}]---对象可否继承
[{INSTANTIABLE|NOTINSTANTIABLE}]---对象可否实例化
/
对象类型的主体部分(即函数的实现部分,可选的):
CREATE[ORREPLACE]
TYPEBODYtype_name{AS|IS}
[{MAP|ORDER}MEMBERfunction_body,]---排序函数
[{MEMBER|STATIC}function_name,]---静态、非静态成员函数
END;
/
例如:
createorreplace
typepersonasobject(
first_namevarchar2(100),
last_namevarchar2(100))
/
属性类型可以是任何oracle数据类型(包括自定义),除了如下:
LONG和LONGRAW
NCHAR、NCLOB、NVARCHAR2
ROWID、UROWID
PL/SQL的特定类型:
%TYPE%ROWTYPE
查看:
Descperson
构造函数:
setserveroutputon
declare
l_personperson
begin
l_person:
=person(‘Donny’,’Chen’);
dbms_output.putline(l_person.first_name);
end;
/
构造函数要接受对象类型的所有属性作为参数。
因为这些参数没有默认值,即使是null,也要提供。
举例:
表中的对象类型:
对象类型可以作为数据库中的列,所以称为列对象
createtableperson_table
(
nameperson,
agenumber)
/
setdescdepthall
descperson_table
setdescdepth1
插入数据:
insertintoperson_table
values(person(‘Donny’,’Chen’),30);
declare
l_personperson
begin
l_person:
=person(‘Hua’,’Li’);
insertintoperson_tablevalues(l_person,33);
end;
/
查询数据:
select*fromperson_table
访问对象类型的各个属性:
selectp.name.first_name
fromperson_tablep
/
为避免名称解析问题,要求查询对象类型的属性的时候,使用表别名。
否则报错,举例:
对象中的对象(合成):
createorreplace
typeemployeeasobject(
nameperson,
empnonumber,
hiredatedate)
/
修改和删除对象:
9i之前,当建立的对象类型,以及依赖于此类型的对象或表之后,就无法再修改此对象类型了(增加删除属性和成员函数)。
唯一的办法是撤销所有以来,即删除依赖于此类型的对象或表。
9i新特性,可以修改被以来的对象类型,成为类型演化。
有两种方法:
INVALIDATE和CASCADE
INVALIDATE比如:
descperson_table
改变person类型,增加新属性ssn
altertypeperson
addattributessnvarchar2(11)INVALIDATE;
descperson(bug可能需要新开一个session)
INVALIDATE选项使的所有依赖于person类型的对象和表标记为INVALID,比如:
Descperson_table
需要手工验证person_table:
altertableperson_tableupgradeincludingdata;
descperson_table
upgradeincludingdata表示根据新类型,物理上更新现有的数据的结构,ssn置为null。
也可以upgradenotincludingdata,不更新原有数据的结构。
Dml访问person实例数据的时候再更新。
Select*fromperson_table
CASCADE比如:
altertypeperson
addattributedobdate
cascadenotincludingtabledata
/
不用手工验证依赖此对象类型的表,由数据库自动验证。
Descperson
Descperson_table
因为notincludingtabledata,没有更新原有数据:
select*fromperson_table
删除类型:
force
方法:
即对象中的过程和函数,3种类型:
STATIC:
只能够在对象类型上调用,不专属于某个实例。
MEMBER:
专属于某个特定的实例
CONSTRUCTOR:
构造函数
createorreplace
typeemployeeasobject(
nameperson,
empnonumber,
hiredatedate,
salnumber,
commissionnumber,
memberfunctiontotal_compensationreturnnumber,
staticfunctionnew(p_empnonumber,
p_personperson)returnemployee)
/
descemployee
在类型主体实现这两个方法:
createorreplace
typebodyemployeeas
memberfunctiontotal_compensationreturnnumberis
begin
returnnvl(self.sal,0)+nvl(mission,0);
end;
staticfunctionnew(p_empnonumber,
p_personperson)returnemployeeis
begin
returnemployee(p_person,p_empno,sysdate,10000,null);
end;
end;
/
比较抽象数据类型的数据:
declare
l_employee1employee;
l_employee2employee;
begin
l_employee1:
=employee.new(12345,null);
l_employee2:
=employee.new(67890,null);
ifl_employee1=l_employee2then
dbms_output.line_put(“Theyareequal”);
endif;
end;
/
使用map指定具体比较哪些属性:
createorreplace
typeemployeeasobject(
nameperson,
empnonumber,
hiredatedate,
salnumber,
commissionnumber,
mapmemberfunctionconvertreturnnumber)
/
createorreplace
typebodyemployeeas
mapmemberfunctionconvertreturnnumberis
begin
returnself.empno;
end;
end;
/
再比较:
declare
l_employee1employee;
l_employee2employee;
begin
l_employee1:
=employee.new(12345,null);
l_employee2:
=employee.new(67890,null);
ifl_employee1=l_employee2then
dbms_output.line_put(“Theyareequal”);
endif;
ifl_employee1>l_employee2then
dbms_output.line_put(“employee1isgreater”);
endif;
ifl_employee1 dbms_output.line_put(“employee2isgreater”); endif; end; / Order方法: createorreplace typeemployeeasobject( nameperson, empnonumber, hiredatedate, salnumber, commissionnumber, ordermemberfunctionmatch(p_employeeemployee)returninteger) / createorreplace typebodyemployeeas ordermemberfunctionmatch(p_employeeemployee)returnintegeris begin ifself.empno>p_employee.empnothen return1; elseifself.empno return-1; else return0; endif; end; end; / 继承: FINAL/NOTFINAL 对象默认FINAL,表示不可以被继承; MEMBER方法也能指定是否FINAL,表示能否在子类中对他进行覆写。 默认NOTFINAL Createorreplacetypesuper_typeasobject( Nnumber, Finalmemberprocedurecannot_override ) notfinal / createorreplacetypesub_typeundersuper_type( overridingmemberprocedurecannot_override ) / showerror 若super_type改成final INSTANTIABLE/NOTINSTANTIABLE 可否被实例化,后者类似于抽象类 createorreplacetypeshapeasobject( number_of_sidesnumber, notinstantiablememberfunctioncalculate_areareturnnumber ) notinstantiablenotfinal / 实例化该类型对象: declare l_shapeshape; begin l_shape: =shape (2); end; / 可变数组(VARRAYS): createtypeemployee_typeasobject( employee_idnumber, first_namevarchar2(30), last_namevarchar2(30) ) / createtypeemployee_list_typeasvarray(50)ofemployee_type / createtabledepartments( department_idnumber, department_namevarchar2(30), manageremployee_type, employeesemployee_list_type) / insertintodepartmentsvalues (10, ‘HR’, employee_type(1,’Dony’,’Chen’), employee_list_type( employee_type(2,’Hua’,’Li’) employee_type(3,’Wu’,’Wang’) employee_type(4,’San’,’Zhang’)) ) / columndepartment_nameformata13 columnemployee_typeformata63word_wrapped select*fromdepartments / 嵌套表(Nestedtable): createtypeorder_item_typeasobject( line_item_idnumber(3), product_idnumber(6), unit_pricenumbe(8,2), quantitynumber(4) ) / createtypeorder_item_list_typeastableoforder_item_type / createtableorders( order_idnumber(12)notnull, order_datedate, customer_idnumber(6), order_itemsorder_item_list_type) nestedtableorder_itemsstoreasorder_items_tab / insertintoordersvalues( (1,sysdate,10, order_item_list_type( order_item_type(1,2,3,4), order_item_type(2,3,4,5) )) / 多少个order_item_type,无限制。 对象表: 每行都代表一个对象,行对象 创建对象: createorreplace typeaddressasobject( idnumber, streetvarchar2(100), statevarchar2 (2), zipcodevarchar2(11) ) / 创建对象表: createtableaddress_tableofaddress / descaddress_table 插入数据: 可以像关系表一样插入 insertintoaddress_tablevalues(1,’Oracleway’,’CA’,’90001’) / 也可以用默认构造函数插入对象: insertintoaddress_table values(address(2,’Oracleway2’,’CA’,’90011’) select*fromaddress_table / VALUE() 以对象表别名作为参数,返回对象实例: selectvalue(a)fromaddress_tablea / REF数据类型: 在关系表中关联对象 createtableemployee_location( empnonumber, loc_refrefaddressscopeisaddress_table) / loc_ref是个列,类型是指向address对象类型的ref,即引用,或者指向address实例的指针。 scopeisaddress_table是可选的,表示ref指向的对象实例的位置,即只能指向address_table对象表中的address对象实例。 REF(): REF()函数可以建立指向对象表中对象实例的REF对象数据类型,以对象表的别名作为参数 插入数据: insertintoemployee_location select12345,ref(a) fromaddress_tablea whereid=1 / insertintoemployee_location select45678,ref(a) fromaddress_tablea whereid=2 / OID: 对象表中每一行对象都对应一个唯一的OID,对象标示符 Select*fromemployee_location DEREF() 解析REF数据类型,返回真正指向的实例。 以REF数据类型作为参数 selectempno,deref(loc_ref) fromemployee_location 悬空REF: REF指向的对象实例被删掉了,此时称REF悬空(dangling),说明ref指向不存在的实例 Deletefromaddress_tablewhereid=1; Select*fromemployee_location; Selectempno,deref(rec_loc)fromemployee_location; 悬空的ref会返回null,使用isdangling确定哪些ref悬空: selectempnofromemployee_location whereloc_refisdangling; 清除悬空的ref,将ref更新为null: updateemployee_location setloc_ref=null whereloc_refisdangling; Select*fromemployee_location; 对象视图: 在已有的关系型表上,建立对象模型: 关系表: createtableitem (itemcodevarchar2(10), item_on_handnumber(10), item_sodenumber(10) ); 建立对象,使用相同的列: createorreplacetypeitem_typeasobject (itemcodevarchar2(10), item_on_handnumber(10), item_sodenumber(10) ); 建立对象视图: createviewitem_viewofitem_type withobjectoid(itemcode) as select*fromitem / ofitem_type说明基于对象 withobjectoid(itemcode)明确生成OID 通过视图操作数据: insertintoitem_viewvalues(item_type(‘i102’,15,50)); MAKE_REF() 关系主表1: createtableitmefile( itemcodevarchar2(5)primarykey, itemdescvarchar2(20), p_categoryvarchar2(20), qty_handnumber(5), re_levelnumber(5), max_levelnumber(5), itemratenumber(9,2)); 关系从表2: createtableorder_detail( ordernovarchar2(5), itemcodevarchar2(5)foreignkeyreferencesitemfile(itemcode) qty_ordnumber(5), qty_deldnumber(5) )
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- oop