频道栏目
读书频道 > 数据库 > Oracle > Oracle入门很简单
11.4.1 对象简介
2012-08-01 15:24:19     我来说两句
收藏   我要投稿

本文所属图书 > Oracle入门很简单

本书从初学者的角度出发,由浅入深、循序渐进地介绍了Oracle数据库开发的基础知识。书中对数据库基本理论及其在数据库开发过程中的应用也有详细介绍。书中也列举了大量示例,可供读者演练。本书共分5篇。第1篇介...  立即去当当网订购
11.4  使用对象视图
 
Oracle虽是关系型数据库,但同样提供了面向对象的支持。Oracle中可以定义对象类型,并根据对象类型来创建对象实例。对象视图正是通过对象的支持来实现的。
 
11.4.1  对象简介(1)
 
对象视图的概念与对象的概念息息相关。本节将首先介绍Oracle中对象的基本概念,然后介绍Oracle中面向对象编程的基本用法,以使读者对对象有较清晰的概念。
 
1.Oracle中的对象类型与对象
 
在Oracle中,可以自定义一个对象类型。这里的对象类型类似于面向对象编程中类的概念。定义一个类型的SQL语法如下所示。
 
 
create or replace type discount_price_obj as object ( 
    attribute1 datatype1, 
    attribute2 datatype2, 
    … 
    … 
    member function function1, 
    … 
    … 
    member procedure procedure1, 
    … 
    … 

 
其中,create or replace type discount_price_obj用于创建一个新的类型;as object代表新类型继承自object;attribute1、attribute2用于定义对象类型所拥有的属性;datatype1、datatype2则用于定义属性的具体数据类型;member function用于定义成员函数;member procedure用于定义成员过程。表11-1列出了Oracle中对象类型与Java中的类在形式上的相似性。
 
表11-1  比较Oracle中的对象类型与Java中的类
 
 
 
  Oracle中的类型 Java中的类
术语 类——type 类——class
基类 继承自Object类——ad Object 继承自Object类
——extends Object
成员变量 属性名称数据类型——
username varchar2(20)
变量类型变量名
——String username
成员方法 函数/存储过程——
member function/procedure
 

 
Java是典型的面向对象编程语言,从二者的比较可以看出,Oracle中的对象类型实际是面向对象思想的体现。
 
【示例11-17】 针对员工信息,可以创建一个简单的对象类型。其属性包括员工ID、员工姓名、员工职位,相应的SQL语句如下所示。
 
SQL> create or replace type employee as object ( 
  2  employee_id number, 
  3  employee_name varchar2(20), 
  4  employee_position varchar(20) 
  5  ); 
  6  / 
  
Type created 
 
当对象类型employee成功创建之后,可以利用视图user_types及视图user_type_attrs中获得相关信息。
 
SQL> select type_name, typecode, attributes from user_types
where type_name = 'EMPLOYEE'; 
 
TYPE_NAME       TYPECODE     ATTRIBUTES 
---------       --------     ---------- 
EMPLOYEE    OBJECT            3 
其中,列type_name代表类型名称;列typecode代表继承自哪个对象;列attributes代表该类型含有属性的个数。
 
在视图user_types_attrs中,可以查询对象类型employee的属性信息。
 
SQL> select type_name, attr_name, attr_type_name, length from user_type_attrs 
  2  where type_name = 'EMPLOYEE'; 
  
TYPE_NAME     ATTR_NAME             ATTR_TYPE_NAME   LENGTH 
---------   -----------------     ---------------    ------ 
EMPLOYEE    EMPLOYEE_ID             NUMBER             
EMPLOYEE    EMPLOYEE_NAME           VARCHAR2           20 
EMPLOYEE    EMPLOYEE_POSITION       VARCHAR2           20 
其中,列type_name代表类型名称;列attr_name代表属性名称;列attr_type_name代表属性的数据类型;列length代表属性的长度。
 
此时,在PL/SQL Developer中,可以查看类型employee的详细信息,如图11-9所示。
 

 
图11-9  在PL/SQL Developer中
查看类型employee的信息
注意:到目前为止,并未创建任何的实际数据,也没有与数据表进行关联

2.从对象到数据

Oracle的对象类型可以用来定义表的结构。例如,创建名为tmp_employee的表,SQL语句如下所示。

SQL> create table tmp_employee of employee; 
 
Table created
其中,create table tmp_employee用于创建新的数据表tmp_employee;of employee表示表的结构来源于对象类型employee。

在表成功创建之后,可以查看表的数据结构:

SQL> desc tmp_employee; 
    Name                    Type       Nullable
Default  Comments 
------------------      ------------  --------
-------  -------- 
EMPLOYEE_ID         NUMBER              Y 
EMPLOYEE_NAME       VARCHAR2(20)        Y 
EMPLOYEE_POSITION   VARCHAR2(20)        Y
同样可以利用select语句查询表中数据:

SQL> select * from tmp_employee; 
 
EMPLOYEE_ID  EMPLOYEE_NAME   EMPLOYEE_POSITION 
-----------  -------------   -----------------
分析表的结构可知,利用对象类型创建的数据表和普通数据表是完全一致的。

【示例11-18】 对象类型的实例是对象,而数据表实际存储的为数据。因此,每个对象实例,都可以映射为表中的某条记录。在Oracle中,可以首先创建对象,然后直接将对象插入到数据表中。

SQL> declare e employee ; 
  2  begin 
  3    e := employee(1, '王五', 'SQA'); 
  4    insert into tmp_employee values (e); 
  5  end; 
  6  / 
 
PL/SQL procedure successfully completed
declare e employee用于声明一个变量e,该变量的类型为employee;在begin-end代码块中,e := employee(1, '王五', 'SQA')用于创建一个employee类型的对象,该对象的三个属性值分别为:1、"王五"、"SQA",employee(1, '王五', 'SQA')可直接实例化一个employee对象,而无须使用new等关键字;insert into tmp_employee values (e)用于向表tmp_employee中插入新的记录,只是此时的记录是一个对象。

在成功执行该PL/SQL代码块之后,可以查询表tmp_employee中的数据进行验证。

SQL> select * from tmp_employee; 
 
EMPLOYEE_ID   EMPLOYEE_NAME    EMPLOYEE_POSITION 
-----------   -------------    ----------------- 
   1                  王五                    SQA
分析查询结果可知,已经成功利用对象向表中插入记录。

需要注意的是,只有利用对象类型创建的数据表,才可以向表中插入对象。例如,可以首先创建一个与表tmp_employee具有完全相同数据结构的数据表temp,并尝试向其中插入employee对象,Oracle将会抛出错误提示。

SQL> create table temp as select * from tmp_employee where employee_ 
id = 0; 
 
Table created
create table temp as select * from tmp_employee where employee_id = 0用于创建新表temp,该表来源于表tmp_employee中所有employee_id为0的记录。很明显,此时将创建一个与表tmp_employee相同结构,但不含任何数据的数据表。

SQL> select * from temp; 
 
EMPLOYEE_ID   EMPLOYEE_NAME    EMPLOYEE_POSITION 
-----------   -------------    -----------------
尝试向表temp中插入employee对象,Oracle将抛出错误提示。

SQL> declare e employee ; 
  2  begin 
  3    e := employee(1, '王五', 'SQA'); 
  4    insert into temp values (e); 
  5  end; 
  6  / 
 
declare e employee ; 
begin 
  e := employee(1, '王五', 'SQA'); 
  insert into temp values (e); 
end; 
 
ORA-06550: line 5, column 15: 
PL/SQL: ORA-00947: not enough values 
ORA-06550: line 5, column 3: 
PL/SQL: SQL Statement ignored 
该错误提示表明,普通数据表不能直接向其中插入对象。图11-10演示了如何实现对象与数据的映射操作流程





3.从数据到对象

数据表中的数据同样可以映射为对象实例。

【示例11-19】 在PL/SQL中,可以对获得的对象进行一系列操作。例如,当前表tmp_employee中含有一条记录,那么,可以将其映射为employee对象。

SQL> declare e employee ; 
  2  begin 
  3    select value(t) into e from tmp_employee
t where employee_id = 1; 
  4    e.employee_id := e.employee_id + 1; 
  5    insert into tmp_employee values (e); 
  6  end; 
  7  / 
 
PL/SQL procedure successfully completed
select value(t) into e from tmp_employee t where employee_id = 1将表tmp_employee中employee_id为1的记录,利用value()函数实例化为一个对象,并将对象存储于变量e;value(t)中的t为表tmp_employee的别名;e.employee_id := e.employee_id + 1用于将对象e的employee_id属性值增加1,此处与面向对象编程中的对象操作完全相同;insert into tmp_employee values (e)再次向表tmp_employee中插入对象e。

在PL/SQL代码块成功执行之后,可以查看表tmp_employee中的数据,以验证操作是否成功。

SQL> select * from tmp_employee; 
 
EMPLOYEE_ID     EMPLOYEE_NAME    EMPLOYEE_POSITION 
-----------     -------------    ---------------- 
   1                    王五                  SQA 
   2                    王五                  SQA
分析查询结果可知,对象e被成功修改,修改后的数据被成功映射到数据表中。图11-11演示了数据映射为对象的示例流程。

 

图11-11  由数据映射到对象的示例流程
4.使用对象的好处

Oracle中的对象数据实际仍然以关系数据的形式存储。但是,对象的特性,例如继承、封装等,都为开发人员提供了更加灵活的处理形式。同样,可以构造复杂的对象类型来封装复杂的多表查询。

另外,在应用程序开发过程中,使用对象传输数据,比普通查询数据的传输效率更高

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:11.3.3 内嵌视图小结
下一篇:11.4.2 对象视图
相关文章
图文推荐
排行
热门
最新书评
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站