Oracle的对象类型允许使用PL/SQL编写面向对象的程序代码。组织上对象类型跟包非常类似,都有规范和主体,同为底层的数据结构提供一层抽象。简单概括有抽象性,一致性,简单性。从关系中用逻辑思维思考,所有操作都是通过对象操作,而不是之前的数据结构,不用在现实世界创建真正的模型,再转换为代码。
PLSQL编程面向对象的操作
1)了解对象类型组成及其组成部分的作用
2)建立简单的对象类型,并使用
3)建立复杂的对象类型,并使用
4)学会建立参照对象类型,并使用
一、对象类型是用户自定义的一种复合数据类型,(数据类型应该是有标量,参照ref ,复合数据类型,bole的),这个复合类型封装了数据结构和数据结构的过程和函数,为了描述显示世界对象所抽象出来的具体特征,既有属性又有方法,应该涵盖对象所具有的公共特性,如每个雇员都有编码,姓名,工资,所以定义employee_type类型时就应该包含这些特征,对象实例是对象类型的具体实现,就是根据模型抽象出一个具体的东西,模型造了一辆汽车。
如雇员scott和smith就是对象类型employee_type的两个对象实例。
create or replace type employee_type is
( ename varchar2(20),eno varchar2(20),sal number(6,3));
create table employee_tab of employee_type;
如果想创建一个对象类型,必须完成对象类型规范(属性和方法的书写)和对象类型体(完善方法的实现)两部分,
首先顶一个对象类型规范需要注意以下几点
1)不能有默认值,不能not null 即 default 4not null是不允许的
2)一些数据类型也不能使用如PLSQL特有的类型,binary_integer %TYPE,%ROWTYPE,ref_cursor record pls_integer等
二、对象类型体里边可以有三类方法默认的为构造方法,
而一个就是member方法,用户访问对象实例的数据,employ employe_type ; employ.method()
static方法,employe_type.method(); 用于访问对象类型,object_type.method();
map方法,order方法只能比较两个对象实例的大小。
这个member方法与static方法区别还是不太明白,有懂得留个言
http://www.cnblogs.com/lanzi/archive/2011/03/30/1999790.html
对象表是包含对象类型的表 有两种术语,列对象行对象
一个是行对象,即类型存储的数据做为一行
create table employe_tab of employe_type;即type的属性即表的列
一个是列对象,即类型存储的数据为表的某几列
create table employtable(
id number,dname varchar2(10),
employee employe_type ,salary number(6,2));
参照型REF数据类型,原理是指向行对象的逻辑指针,Oracle内置数据类型,可以使用不同表共享对象从而降低内存使用。
create table department(
dno number(2), dname varchar2(10),emp REF employee_type);
三、正式开始编写对象类型 首先建立对象类型规范,然后再写建立对象类型体如果类型规范里边没有方法,那么就不用书写对象类型体了。
create or replace type type_name as object(
attribute1 datatype[,attribute2 datetype,...],
[member|static method1 ,]
create or replace type body type_name as|is
member|static method1 body;
member|static method2 body;
...
eg:
create or replace type person_type1 as object( 创建不带方法的对象类型规范,所以不需要完善body
name varchar2(2),gender varchar2(2),birthdate date);
使用对象类型,即用类型创建表
create table person_tab1 of person_type1 ;用的行对象
create table person_tab2 (;用的列对象
eno number(6),person person_type1,
sal number(6,2)
);
eg:
create or replace type person_type2 as object(
name varchar2(2),gender varcahr2(22),birthdate date,
member procedure change_address(new_addr varchar2),
member function get_info return varchar2
);带方法的对象类型规范
完善body对象类型体
create or replace type body person_type2 is
member procedure change_address(new_addr varchar2)
is
begin
address:=new_addr;
end;
member function get_info return varchar2
is
v_info varchar2(100);
begin
v_info:='姓名:'||name||',出生日期'||birthdate;
return v_info;
end;
end;
使用对象类型,即用类型创建表
create table employee_tab2(
eno number(6,2) ,person person_type2,
sal number(6,2),job varchar2(10)
);
insert into employee_tab2 values(person_type2('王楠','男',to_date('20141212','YYYYMMDD'),'呼和浩特'),1,2000,'高级技工');
PLSQL检索行对象数据时,如果将数据放到对象类型变量中,必须使用vlue函数
declare
person person_type1;
begin
select vlue(p) into person from emp p
where p.name = '&name';
dbms_output.put_line('sex is '||person.gender);
end;
创建的列对象的表,检索数据的时候一样要将只放到类对象变量中
declare
person2 person_type1;
begin
select person,sal into person2,salary from emp where empno='&no';
end;
declare
v_person person_type2;
begin
select person into v_person from employee_tab2
where eno=&no;
v_person.change_address('aaaa'); 实例访问的原数据
dbms_output.put_line(v_person.get_info); 实例访问的
end;
这个对象类型还有一个比较恶心的就是比如我用了列对象创建了表,那么我访问里边的数据的时候就比较麻烦,使用的时候注意
比如employee_table3 我用了person对象类型 在执行select name from employee_table3就会报错,查询需要这样 select (person).name from employee_table3 update的时候需要这样
update employee_table3 set person.sal=(person).sal+3 where person.name='XXXX'
本文转自 aklaus 51CTO博客,原文链接:http://blog.51cto.com/aklaus/1951516