/* 对象类型属于用户自定义的一种复合类型,它封装了数据结构和拥有操作这些数据结构的函数。
对象类型;对象类型体和对象类型规范组成
对象类型属性不能使用以下类型定义。如;long,rowid,%type,%rowtype,ref cursor,record, pls_integer等
涉及到成员方法。构造方法,静态方法,map方法(将对象类型进行比较,因为对象不像标量那样可以直接排序),最大只能定义一个map 方法
map方法可以对个对象进行排序,而order方法只能对两个对象实例比较大小 ,map和order不能同时定义。
《1》对象表
对象表是包含对象类型列的表,而普通表其列全部使用标量数据类型。分为行对象表和列对象表
1.行对象表,
eg; create table obj_emp of emp_type;
2.列对象(包含多个列)
eg; create table obj_emp(
dno number,dname varchar2(10),
emp emp_type
);
《2》对象类型继承
《3》引用对象类型 ref(指向对象的逻辑指针,是oracle的一种内置数据类型)(通过引用可以使不同表共享相同对象,从而降低内存占用)
如 create table obj_emp2 (
dno number,
emp ref obj_emp --引用上面的行对象
);
《4》建立对象类型
1.建立无方法的对象类型
create or replace type emp_type as object (
name varchar2(8),
birthdate date
);
--建立行对象表
create table emp_tab of emp_type ;
--插入数据
insert into emp_tab values('tom',to_date('1980-1-25','yyyy-mm-dd'));--普通插入
insert into emp_tab values(emp_type('sam',to_date('1983-1-25','yyyy-mm-dd'))); --采用对象类型构造方法插入
-- 在pl/sql块中,如果要将对象数据检索到对象变量中,则必须用value方法
declare
emp emp_type;
begin
select value(p) into emp from emp_tab p where p.name = '&name';
dbms_output.put_line(emp.birthdate);
end;
-- 更新行对象数据,如果根据对象属性更新数据时必须定义对象别名
eg; update emp_tab p set p.birthdate=to_date('2000-1-23',yyyy-mm-dd) where p.name=&name;
-- 删除行对象类型数据是如果根据对象属性删除数据 ,则删除时必须定义别名
begin
delete from emp_tab p where p.name=&name;
end;
/
==============================================================================================
-- 创建列对象表
create or replace type emp_l_tab as object (
dname varchar2(),emp emp_type
);
-- insert (用对象类型的构造方法插入数据)
insert into emp_l_tab values('db' emp_type('tom',to_date('2011-06-14',sysdate)));
-- 检索列对象
检索行对象类型数据到类型变量时必须用value方法,但检索列对象时可以直接检索到类型变量
declare
v_emp_l emp_type ;
v_dname varchar2(20) ;
select dname,emp into v_dname,emp from emp_l_tab b where b.dname=&dname;
--更新列对象时,必须为列对象定义别名(列对象别名.对象类型列名.对象属性名)
update emp_l_tab b set b.emp.birthdate = to_date('2011-06-14','yyyy-mm-dd') where b.dname=&dame;
--删除类同更新数据
2.建立有方法的对象类型
1》 建立和使用member(成员)方法的对象类型(建立对象类型规范)
eg;
create or replace type emp_m_type as object(
dname varchar2(20), ddate date,addr varchar2(100),
member procdure proc_change_addr(newaddr dname),
member function func_get_dname return varchar2
);
/
2》建立对象类型体
create or replace type body emp_m_type is
member procdure proc_change_addr(newaddr varchar2)
is
begin
addr ;= newaddr;
end;
member function func_get_dname return varchar2
is
v_dname varchar2(20);
begin
v_danme := '部门:'||dname ||'--'|| birthdate ;
return v_danme;
end;
end;
/
-- 插入数据类同上面
-- 提前数据
declare
v_emp emp_m_type;
begin
v_emp ;= emp.get_dname('上海徐汇');
......................
end;
/
--3 建立和使用static 方法
static 方法用于访问对象类型,如果需要在对象类型上执行全局操作,则应该定义static
方法。只能有对象类型访问static
create or replace type emp_type3 as object(
name varchar2(10),gender varchar2(2),
static function getname return varchar2,
member function get_gender return varchar2
);
--建立对象类型体
create or replace type body emp_type3 is
static function getname return varchar2 is
begin
return 'jecker';
end;
member function get_gender return varchar2
is
begin
return 'xingbie='||gender;
end;
end;
;
-- 基于对象类型emp_type3 建立 emp_tab3
create table emp_tab3(
eno number(6),emp emp_type3,
sal number(6,2),job varchar2(10)
);
-- 向表emp_tab3插入数据
begin
insert into emp_tab3(eno,sal,job,emp)
values(100001,9999,'CTO/CIO',emp_type3(
'jeckery',emp_type3.getname()
));
end;
-- 访问 静态static函数和成员方法(member)
declare
e emp_type3;
begin
select t.emp into e from emp_tab3 t where rownum=1;
raise_application_error(-20201,emp_type3.getname()||'-----'||e.get_gender());
end;
-- 4.建立和使用 map 方法
map方法用于将对象实例映射成标量值。
-- 建立对象类型emp_type4
create or replace type emp_type4 as object(
name varchar2(10),
birthdate date,
map member function get_birdate return varchar2
);
-- 为emp_type4 对象类型实现方法体
create or replace type body emp_type4 is
map member function get_birdate return varchar2 is
begin
return trunc((sysdate-birthdate)/365);
end;
end;
-- 根据对象类型empa_type4 创建表emp_tab4
create table emp_tab4 (
eno number(6),sal number(6,2),
job varchar2(20),emp4 emp_type4
);
-- 插入数据到emp_tab4
begin
insert into emp_tab4(eno,sal,job,emp4)
values(0011,9000,'dba',emp_type4('jacker',to_date('1990-12-19','yyyy-mm-dd')));
insert into emp_tab4(eno,sal,job,emp4)
values(0022,9900,'dba',emp_type4('jacker',to_date('1970-12-2','yyyy-mm-dd')));
end;
--比较数据
declare
type emp4_tab is table of emp_type4;
v_emp4_tab emp4_tab;
v_result varchar2(100);
begin
select emp4 bulk collect into v_emp4_tab from emp_tab4 ;
if v_emp4_tab(1).get_birdate()>v_emp4_tab(2).get_birdate() then
v_result := v_emp4_tab(1).name ||' 比 '||v_emp4_tab(2).name ||'大';
else
v_result := v_emp4_tab(1).name ||' 比 '||v_emp4_tab(2).name ||'小';
end if;
raise_application_error(-20201,v_result);
end;
-- 5 建立order 方法
1.order 与 map 在一个对象类型中不能同时存在
2.order 用于比较对象的2个实例大小
-- 建立对象类型emp_type4
create or replace type emp_type5 as object(
name varchar2(10),
birthdate date,
order member function compare(emp5 emp_type5) return int
);
-- 为emp_type4 对象类型实现方法体
create or replace type body emp_type5 is
order member function compare(emp5 emp_type5) return int is
begin
case
when birthdate>emp5.birthdate then return 1;
when birthdate=emp5.birthdate then return 0;
when birthdate<emp5.birthdate then return -1;
end case;
end;
end;
-- 根据对象类型empa_type4 创建表emp_tab4
create table emp_tab5 (
eno number(6),sal number(6,2),
job varchar2(20),emp5 emp_type5
);
-- 插入数据到emp_tab4
begin
insert into emp_tab5(eno,sal,job,emp5)
values(0011,9000,'dba',emp_type5('jacker',to_date('1990-12-19','yyyy-mm-dd')));
insert into emp_tab5(eno,sal,job,emp5)
values(0022,9900,'dba',emp_type5('tom',to_date('1970-12-2','yyyy-mm-dd')));
end;
--比较数据
declare
type emp5_tab is table of emp_type5;
v_emp5_tab emp5_tab;
v_result varchar2(100);
begin
select emp5 bulk collect into v_emp5_tab from emp_tab5 ;
if v_emp5_tab(1).compare(v_emp5_tab(2))=1 then
v_result := v_emp5_tab(1).name ||' 比 '||v_emp5_tab(2).name ||'大';
else
v_result := v_emp5_tab(1).name ||' 比 '||v_emp5_tab(2).name ||'小';
end if;
raise_application_error(-20201,v_result);
end;
-- 6. 建立包含自定义对象类型的构造方法
oracle 9i 开始可以自定义构造函数
create or replace type emp_type6 as object(
name varchar2(10),birthdate date,
constructor function emp_type6(name,varchar2) return self as result;
);
方法体的实现类同5
==========================================================================================
《2》复杂对象类型
1.嵌套对象类型:一个对象类型中嵌套另一个对象类型
create or replace typed emp_addr_type7 as object(
addr varchar2(100)
);
eg;
create or replace typed emp_type7 as object(
name varchar2(10), emp_addr emp_addr_type7
);
2.参照对象类型:建立对象表时 使用ref 定义表列,ref实际是指向对象数据的逻辑指针。
........
《3》查看对象类型
1.查看对象类型
select type_name ,final from user_types;
2.修改对象类型
alter type emp_type7 add atrribute addr varchar2(10) cascade;
...
oracle 对象类型 object type
最新推荐文章于 2021-04-13 00:31:04 发布