ORACLE抽象数据类型

ORACLE抽象数据类型

*抽象数据类型*/
1,抽象数据类型 概念
包含一个或多个子类型的数据类型
不局限于ORACLE的标准数据类型
可以用于其他数据类型中

2,创建抽象数据类型 的语法(必须用NOT FINAL关键字指出是可以继承的类型)
CREATE TYPE type_name AS OBJECT (columns……) [NOT FINAL];

//例:
--创建抽象数据类型 ——地址类型—— addresstype

create or replace type addresstype as object
(
province varchar(20),
city varchar(30),
street varchar(40)
)
/
--查看数据类型的定义情况
SQL> desc addresstype;
名称 是否为空? 类型
----------------------------------------- -------- -------------
PROVINCE VARCHAR2(20)
CITY VARCHAR2(30)
STREET VARCHAR2(40)

--使用自定义的抽象数据类型创建表

create table students
(
stuName varchar(10),
stuAddress addresstype
);

--查看表结构
SQL> desc students;
名称 是否为空? 类型
----------------------------------------- -------- -------------
STUNAME VARCHAR2(10)
STUADDRESS ADDRESSTYPE

--插入数据(使用构造函数)

insert into students values ('TOM',addresstype('吉林省','长春','前进大街'));

--查看表中的数据

SQL> select s.stuName,s.stuAddress.city from students s;

STUNAME STUADDRESS.CITY
---------- ------------------------------
TOM 长春

--更新表中的记录
//方法1,构造一个新的对象替换原先的对象,假设对象包含的数据较多时,相当麻烦
update students s
set s.stuAddress = addresstype('湖南省','长沙','银盆岭')
where stuName = 'TOM';

//方法2,使用表的别名,一层层的访问到对象的字段,进行修改
update students s
set s.stuAddress.city = '白城'
where stuName = 'TOM';

———————————————————————————
3,抽象数据类型的继承,用抽象数据类型创建表
//例:
--创建父类型(not final)
create or replace type Person as object
(
personName varchar(10),
personSex varchar(2),
personBirth date
) not final;

--创建子类型(under 父类型)
create or replace type StudentType under Person
(
studentNo int,
studentScore int
);

--查看类型定义

SQL> desc person;
person is NOT FINAL
名称 是否为空? 类型
----------------------------------------- -------- -------------
PERSONNAME VARCHAR2(10)
PERSONSEX VARCHAR2(2)
PERSONBIRTH DATE

SQL> desc studenttype;
studenttype extends SCOTT.PERSON
名称 是否为空? 类型
----------------------------------------- -------- ------------
PERSONNAME VARCHAR2(10)
PERSONSEX VARCHAR2(2)
PERSONBIRTH DATE
STUDENTNO NUMBER(38)
STUDENTSCORE NUMBER(38)

--用抽象数据类型 studenttype 创建表 student
SQL> create table student of studenttype;

表已创建。

SQL> desc student;
名称 是否为空? 类型
----------------------------------------- -------- ------------
PERSONNAME VARCHAR2(10)
PERSONSEX VARCHAR2(2)
PERSONBIRTH DATE
STUDENTNO NUMBER(38)
STUDENTSCORE NUMBER(38)

--向表中插入数据

--方法1

insert into student values ('PPP','男',to_date('2000-1-1','YYYY-MM-DD'),1001,89);

--方法2

insert into student
select studenttype('刘鑫锐','男',to_date('1984-04-18','YYYY-MM-DD'),1002,90)
from dual;

抽象数据类型,让Oracle数据库数据管理更加容易

www.educity.cn 作者:数据库学院 来源:希赛网  2013年11月13日  文章评论
 

  姓名,其实包括两个部分,分别为姓与名。在没有抽象数据类型之前,在数据库设计的时候,往往需要利用两个字段来保存这个姓名内 容,如First_name与Last_name等等。这主要是因为在很多时候,前台应用程序只需要用到姓即可,因为在称呼别人的时候,往往不会连名带姓 的叫。如在CRM系统中,若利用CRM系统自带的邮件系统给客户发送邮件的时候,台头往往是李公、张公等等。而不会带来名字。为此,就需要把姓与名分开来 保存。

  此时,若没有抽象数据类型的话,则在数据库中就需要设立两个字段来处理。但是,在Oracle数据库8以后的版本,包括现在最新的数据库版本, 都有一个抽象数据类型,专门来处理这些问题。简单的讲,抽象数据类型就是一些可以作为单独实体的小的基本数据类型的集合。或者说,抽象数据类型是用户自己 做的一个箱子,里面有很多抽屉,而每个抽屉就是一个原始的数据类型,如INT或者Varchar数据类型。把几个基本的数据类型根据不同的需要,组合成一 个新的抽象数据类型,这就让数据库管理员在处理数据的时候,更加的容易;而且容易控制,减少出错的几率。

  一、抽象数据类型的用途。

  抽象数据类型在实际工作中非常管用。因为自从面向对象的JAVA语言出现后,Oracle数据库设计者就开始意识到创建抽象数据类型的能力可以 大大简化他们的Oracle数据库设计。为此,经过他们的努力,在Oracle数据库中,对SQL语句进行了扩展,实现了面向对象的抽象数据类型。具体的 来说,抽象数据类型主要有以下几个优点。

  一是可以重复使用。抽象数据类型集成了普通数据结构的层次性,为此,用户定义的抽象数据类型可以在整个数据库范围内多次使用。如此的话,就可以 减少编码的时间,并且确保了数据结构的统一性。如用户自定义的姓名抽象数据类型,其不仅可以在企业员工信息表中使用,也可以在业务伙伴联系人表中使用。数 据库管理员不需要每次使用时都定义一次。

  二是灵活性。有了抽象数据类型就可以创建数据的真实世界表现形式的能力使得Oracle数据库对象设计者可以塑造一个真实世界的模型,并且创建可以统一应用于设计的强有力的数据类型。其实,这就是面向对象的编程语言的根本特性。

  三是可以实现对数据很好的封装。因为每一个抽象数据类型以一个完整的实体存在,它包括数据定义、默认值和取值范围。添加抽象数据类型可以确保整 个Oracle数据库范围的统一性与一致性。一旦定义了某个抽象数据库类型,它就可以加入到很多其他的抽象数据类型中,因为无论这些数据类型在数据库中出 现在何处,相同的逻辑数据类型总是具有相同的定义、默认值与取值范围。如在一个ERP系统的产品基本信息表中,有产品规格、尺寸、颜色、外处理方式等等。 为此,无论在产品基本信息表中,还是在订单表中,都可以实现很好的一致性。而且,此时若在订单层面对这个数据进行更新的话,也不容易出错。

  二、抽象数据类型建立与引用。

  上面笔者谈到过,抽象数据类型就是一些基本数据类型的组合。下面笔者以地址为例,谈谈抽象数据类型的建立与引用。如现在某个地址,具有如下内 容,分别为街道、城市、省份、邮编等。其中街道、城市、省份三个位字符型数据,而邮编则为整数型字段。为了数据的一致性与统一性,数据库管理员决定采用抽 象数据类型来管理这些内容。

  1、 定义名为Adrees的抽象数据类型。

  我们可以利用Create Type语句来建立新的抽象数据类型。具体的语句如下:

  Create OR Replace Type Adress AS OBJECT

  (街道 Varchar2(100),

  城市 Varchar2(100),

  省份Varchar2(100),

  邮编 integer(6));

  OR Replace关键字跟在其他语句中具有相同的作用。它表示若有其他相同的抽象数据类型的话,则这个语句就会替换原有的抽象数据类型。另外,在建立抽象数 据类型的时候,利用中文名字来定义仍然不是一个好的习惯。最好要利用统一命名规则来定义其内部的名字。笔者上面只是为了叙述方面的简便起见,才如此定义。 所以,数据库管理员在这方面还是需要有一个清晰的认识。

  2、 抽象数据的引用。

  当建立好抽象数据类型的时候,数据库管理员就可以向基本数据类型那样,引用抽象数据类型,包括在建立表或者对相关字段进行赋值的时候,都这么方便。

  如在建立表的时候,可以把这个抽象数据类型直接跟某个字段关联起来。如

  Create Table USERS

  (F­­_Adress Adress );

  上面这个语句就是在USERS表中建立了一个F_Adress的字段,其数据类型为Adress。

  若要对这个字段赋值的话,需要注意一个问题,要依次输入赋值的内容,顺序不能够颠倒。如按照上面的定义,用户在赋值的时候,需要依次输入街道、 城市、省份、邮编等等内容。若用户在输入的过程中,忘记输入城市的话,则省份的内容将会直接输入到城市中。另外,若数据类型不匹配的话,则就直接会有错误 提示。当然数据库管理员也可以根据需要,为特定的数据内容设置默认值,以方便管理。

  三、抽象数据类型管理经验分享。

  笔者平时在数据库设计中,非常钟爱这个抽象数据类型。笔者十多年的数据库管理经验证明,利用抽象数据类型可以大幅度的简化我们平时的工作。为此笔者在这方面也积累了不少的经验。这里就拿出来跟大家分享一下。

  经验一:利用脚本建立抽象数据类型。

  对于一些常用的抽象数据类型,数据库管理员最好能够利用脚本来建立抽象数据类型。如果每次建立数据库的时候,都通过手写代码来完成的话,工作量 会比较大。如笔者在日常工作中,就把常用的一些抽象数据类型,如员工姓名、地址、产品规格等抽象数据类型都保存在一个SQL脚本中,等到需要的时候,只需 要运行这个脚本即可。这就可以减少一些不需要的编码的编写,从而提高数据库开发设计的效率。

  经验二:对于多个数据库对象中经常需要用到的数据,最好采用抽象数据类型。

  如在一个ERP系统中,产品基本信息的产品规格可能包含多个部分的内容,如产品的颜色、尺寸、大小、外处理方式等等。而在采购订单、进货单等地 方有需要多处进行引用。为了保障数据的一致性与统一性,最好为产品规格设置一个抽象数据类型 。如此的话,一方面在其他对象中引用这个内容的话,不用一个个字段的引用,从而简化应用程序的设计; 另一方面,因为这些信息组合才能够唯一的定位产品,所以,在采购订单或者其他单据中统一的显示,非常的关键。为此,若能够一个数据类型来包含这些内容的 话,则应用程序设计时就可以减少错误的发生。

  经验三:要考虑不同数据库库的兼容性问题。

  抽象数据类型,它是Oracle数据库对标准SQL语句的一种扩展。所以,虽然Oracle数据库提供了抽象数据类型的功能,但是,其他品牌的 数据库不一定支持。这也就是说,这个抽象数据类型的兼容性并不时很好。如果数据库管理员能够预见在以后可能会把数据库迁移到其他平台的数据库中,则这个抽 象数据类型就需要慎用。否则的话,在数据库移植的过程中,就会平白的遇到很多麻烦。

  另外,由于标准的SQL语句不支持这个抽象数据类型,所以,如果采用其他的非Oracle数据库出的SQL语句,就可能会造成额外的困扰。如有 些数据库管理员喜欢采用Excle等工具作为Oracle数据库管理的辅助工具。若在数据库中采用了抽象数据类型,那么Excle软件将无法很好的支持 Oralce数据库。这也是Oracle数据库管理员在考虑采用抽象数据类型需要考虑的内容。

  最后,有一个值得庆幸的就是,这些抽象数据类型的执行计划与其他Oracle数据库系统默认的内部数据类型的执行计划相同。这也就是说,抽象数 据类型的引入对SQL语句的执行性能将不会产生任何影响。换一句话说,采用抽象数据类型并不会降低数据库的性能,相反可以提高数据库数据管理的一致性与统 一性,从而让数据管理起来更加的容易。所以说,如果不考虑抽象数据类型的兼容性问题的话,那么抽象数据类型将是数据库管理员规划数据的一个好帮手。

上一篇:java 8-stream 常见使用


下一篇:源码分析篇 - Android绘制流程(一)窗口启动流程分析