oracle中对象类型搜集(objecttype)
/* 对象类型属于⽤户⾃定义的⼀种复合类型,它封装了数据结构和拥有操作这些数据结构的函数。
对象类型;对象类型体和对象类型规范组成
对象类型属性不能使⽤以下类型定义。如;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 p.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 ;= _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',ame()
));
end;
-- 访问静态static函数和成员⽅法(member)
declare
e emp_type3;
begin
p into e from emp_tab3 t where rownum=1;
raise_application_error(-20201,ame()||'-----'||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 ⽅法
-
- 建⽴对象类型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)pare(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 type object 对象类型继承,参考官⽅⽂档:
oracle create type object inherit
2.3.5.2 Creating a Subtype Object
A subtype inherits the attributes and methods of the supertype.
These are inherited:
All the attributes declared in or inherited by the supertype.
Any methods declared in or inherited by supertype.
defines the student_typ object as a subtype of person_typ, which inherits all the attributes declared in or inherited by person_typ and any methods inherited by or declared in person_typ.
Example 2-15 Creating a student_typ Subtype Using the UNDER Clause
1.
-- requires Ex. 2-14
2.
CREATE TYPE student_typ UNDER person_typ (
3.
dept_id NUMBER,
4.
major VARCHAR2(30),
5.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论