PLSQL编程面向对象的操作

  1. 云栖社区>
  2. 博客>
  3. 正文

PLSQL编程面向对象的操作

科技小能手 2017-11-12 22:32:00 浏览551
展开阅读全文

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

网友评论

登录后评论
0/500
评论
科技小能手
+ 关注