您的位置:首页 > 数据库

PL/SQL入门--复杂对象类型

2012-08-02 21:54 429 查看
12.建立和使用复杂对象类型

复杂对象类型是指与其他对象类型具有关联关系的对象类型
1.对象类型嵌套
建立对象类型
create or replace type addr_typ7 as object(

state varchar2(20),city varchar2(20),

street varchar2(50),zipcode varchar2(6),

member function get_addr return varchar2);

建立对象类型体实现该方法:
create or replace type body addr_typ7 as

member function get_addr return varchar2 is

begin

return state||city||street;

end;

end;

建立对象类型(嵌套):

create or replace type person_typ7 as object(

name varchar2(10),gender varchar2(2),birthdate date,address addr_typ7,

member function get_info return varchar2);


建立对象类型体:
create or replace type body person_typ7 as

member fucntion get_info return varchar2

is

begin

return '姓名:'||name||',家庭住址:'||address.get_addr();

end;

建立操纵对象表:
create table employee_tab7(

eno number(6),person person_typ7,sal number(6,2),job varchar2(10));

操纵对象表
在PLS/SQL块中为对象表插入数据
begin

insert into employee_tab7(eno,sal,job,person) values(1,1500,'图书管理员',person_typ7('马丽','女','11-1月-76',addr_typ7('内蒙古','呼和浩特','囫囵路10','010010')));

insert into employee_tab7(eno,sal,job,person) values(2,1500,'图书管理员',person_typ7('马丽','女','11-1月-76',addr_typ7('内蒙古','呼和浩特','囫囵路20','010010')));

end;

在PL/SQL块中更新对象列数据
declare

v_pserson person_typ7;

begin

select person into v_person from employee_tab7 where eno=&&no;

v_person.address.street:='&street';

update employee_tab7 set person=v_person where eno=&no;

end;

在PL/SQL块中检索对象列数据
declare

v_person person_typ7;

begin

select person into v_person from employee_tab7 where eno=&no;

dbms_output.put_line(v_person.get_info);

end;

在PL/SQL块中删除对象表数据
begin

delete from employee_tab7 where eno=&no;

end;

2.参照对象类型
指在建立对象表时使用REF定义表列,REF实际是指向行对象数据的逻辑指针
通过使用REF定义表列,可以使得一个对象表引用另一个对象表(行对象)的数据,从而节省磁盘空间和内存空间
建立对象类型:
create or replace type person_typ8 as object(

name varchar2(10),gender varchar2(2),birchdate date,address varchar2(50),

member function get_info return varchar2);

建立对象类型体:
create or replace type body person_typ8 as

member function get_info return varchar2

is

begin

return '姓名:'||name||',家庭住址:'||address;

end;

end;

建立行对象并追加数据
create table person_tab8 of person_typ8;

insert into person_tab8 values('马丽','女','11-1月-76','内蒙古呼和浩特10号');

insert into person_tab8 values('王名','男','11-1月-76','内蒙古呼和浩特11号');

对象表引用对象表(REF)
建立对象表(引用表)
create table employee_tab8(

eno number(6),person ref person_typ8,sal number(6,2),job varchar2(10));

操纵对象表
为对象表出入数据
引用行对象表时,需要使用函数REF(),其返回值实际是指向相应数据行的指针
begin

insert into employee_tab8 select 1,ref(a),2000,'图书管理员' from person_tab8 a where a.name = '马丽';

insert into employee_tab8 select 1,ref(a),2000,'图书管理员' from person_tab8 a where a.name = '王名';

end;

检索REF对象列数据
为了取得行对象的相应数据,必须要使用DEREF函数取得REF列所对应的实际数据
declare

v_person person_typ8;

begin

select deref(person) into v_person from employee_tab8 where eno=&no;

dbms_output.put_line(v_person.get_info);

end;

更新REF对象列数据
要修改其列所引用的数据,就必须修改相应的行对象
declare

v_person person_typ8;

begin

select deref(person) into v_person from employee_tab8 where eno=&no;

v_person.address:='&address';

update person_tab8 set address=v_person.address where name=v_person.name;

end;

删除对象表数据
begin

delete from employee_tab8 where eno=&no;

end;

3.对象类型继承
指一个对象类型继承另一个对象类型,并且对象类型继承由父类型和子类型组成
父类型用于定义不同对象类型的公用属性和方法,而子类型不仅继承了父类型的公用属性和方法,而且还可具有自己的私有属性和方法.
使用对象类型继承时,在定义父类型时必须要指定NOT FINAL 选项,如果不指定该选项,默认为FINAL,表示该对象类型不能被继承
建立父对象类型:
create or replace type person_typ9 as object(

name varchar2(10),gender varchar2(2),birthdate date,address varchar2(50),

member function get_info return varchar2) not final;

建立对象类型体:
create or replace type body person_typ9 as

member function get_info return varchar2

is

begin

return '姓名:'||name||',家庭住址:'||address;

end;

end;

建立子对象类型(继承):
create or replace type employee_typ9 under person_typ9(

eno number(6),sal number(6,2),job varchar2(10),

member function get_other return varchar2);

建立对象类型体(私有方法):
create or replace type body employee_typ9 as

member function get_other return varchar2

is

begin

return '雇员名称:'||name||',工资:'||sal;

end;

end;

建立对象表并插入数据
sql>create table employee_tab9 of employee_typ9;

sql>insert into employee_tab9 values('马丽','女','01-11月-76','呼和浩特15号',2,2000,'高级钳工');

sql>insert into employee_tab9 values('王名','男','01-11月-76','呼和浩特15号',2,2000,'高级钳工');


使用对象方法输出数据
declare

v_employee employee_typ9;

begin

select value(a) into v_employee from employee_tab9 a where a.eno=&no;

dbms_output.put_line(v_employee.get_info);

dbms_output.put_line(v_employee.get_other);

end;

4.维护对象类型
显示对象类型信息 执行CREATE TYPE 命令建立对象类型时,ORACLE会将对象类型的信息存放到数据字典中(USER_TYPES)
select type_name,attributes,final from user_types;

desc person_typ1


增加和删除对象类型属性
 如果已经基于对象类型建立了对象类型或对象表,那么在对象类型增加或删除属性时必须要带有CASCADE关键字
alter type preson_typ1 add attribute address varchar2(50) cascade

alter type person_typ1 drop attrbute birthdate cascade;

增加和删除对象类型方法
alter type person_typ1 add member function get_info return varchar2 cascade;

create or replace type body person_typ1 as

member function get_info return varchar2 is

begin

return '雇员名:'||name||',家庭住址:'||address;

end;

end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle pl/sql 对象类型