PLSQL编程面向对象的操作

简介:

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

相关文章
|
4月前
|
程序员 Go
Go 语言:面向对象还是非面向对象?揭开编程语言的本质
Go 语言:面向对象还是非面向对象?揭开编程语言的本质
|
SQL 存储 数据库
数据库原理与应用(SQL Server)笔记 第七章 流程控制语句、系统内置函数
数据库原理与应用(SQL Server)笔记 第七章 流程控制语句、系统内置函数
数据库原理与应用(SQL Server)笔记 第七章 流程控制语句、系统内置函数
|
SQL 存储 关系型数据库
SQL 编程思想:一切皆关系
SQL 编程思想:一切皆关系
178 0
SQL 编程思想:一切皆关系
十一、详解面向对象[下]
原型对象其实也是普通的对象。几乎所有的对象都可能是原型对象,也可能是实例对象,而且还可以同时是原型对象与实例对象。这样的一个对象,正是构成原型链的一个节点。因此理解了原型,那么原型链并不是一个多么复杂的概念。 我们知道所有的函数都有一个叫做toString的方法。那么这个方法到底是在哪里的呢? 先随意声明一个函数:
110 0
十一、详解面向对象[下]
|
前端开发 JavaScript
十一、详解面向对象【上】
如果要我总结一下学习前端以来我遇到了哪些瓶颈,那么面向对象一定是第一个会想到的。尽管现在对于面向对象有了一些的了解,但是当初那种似懂非懂的痛苦,依然历历在目。 为了帮助大家能够更加直观的学习和了解面向对象,我会用尽量简单易懂的描述来展示面向对象的相关知识。并且也准备了一些实用的例子帮助大家更加快速的掌握面向对象的真谛。
129 0
十一、详解面向对象【上】
|
存储 SQL 关系型数据库
部分 I. 教程_第 2 章 SQL语言_2.2. 概念
2.2. 概念 PostgreSQL是一种关系型数据库管理系统 (RDBMS)。这意味着它是一种用于管理存储在关系中的数据的系统。关系实际上是表的数学术语。 今天,把数据存储在表里的概念已经快成了固有的常识了, 但是还有其它的一些方法用于组织数据库。
1080 0