【数据库】Oracle数据库----对象视图
oracle虽是关系型数据库,但同样提供了面向对象的支持。oracle中可以定义对象类型,并根据对象类型来创建对象实例。对象视图正是通过对象的支持来实现的。
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用于定义成员过程。
JAVA是典型的面向对象编程语言,从二者的比较可以看出,oracle中的对象类型实际是面向对象思想的体现。
例子:针对员工信息,可以创建一个简单的对象类型。其属性包括员工ID、员工姓名、员工职位,相应的SQL语句如下所示。
SQL>create or replace type employee as object(
employee_id number, employee_name varchar2(20), employee_position vharchar(20) );
当对象类型employee成功创建之后,可以利用视图user_types及视图user_type_attrs中获得相关信息。
SQL>select type_name, typecode, attributes from user_types where type_name = 'EMPLOYEE';
其中,列type_name代表类型名称,列typecode代表继承自哪个对象,列attributes代表该类型含有属性的个数。
在视图user_types_atttrs中,可以查询对象类型employee的属性信息。
SQL>select type_name, attr_name, attr_type_name, length from user_type_attrs
where type_name = 'EMPLOYEE';
其中,列type_name 代表类型名称;列attr_name代表属性名称;列attr_type_name代表属性的数据类型;列length代表属性的长度。
此时,在PL/SQL Developer中,可以查看类型employee的详细信。
【注意】until now, 并未创建任何的实际数据,也没有与数据表进行关联。
(2)从对象到数据
oracle的对象类型可以用来定义表的结构,例如:创建名为tmp_employee的表,SQL语句如下所示。
SQL>create table tmp_employee of employee;
其中,create table tmp_employee 用于创建新的数据表tmp_employee; of employee 表示表的结构来源于对象类型employee。
在表成功创建之后,可以查看表的数据结构:
SQL>desc tmp_employee;
分析表的结构可知,利用对象类型创建的数据表和普通数据表是完全一致的。
例子:对象类型的实例是对象,而数据表实际存储的为数据。因此,每个对象实例,都可以映射为表中的某条记录,在oracle中,可以首先创建对象,然后直接将对象插入到数据表中。
SQL>declare e employee; begin e: = employee(1, ' 王五', ‘SQA’);insert into tmp_employee values (e);end;
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中的数据进行验证。
需要注意的是,只有利用对象类型创建的数据表,才可以向表中插入对象。例如:可以首先创建一个与表tmp_employee具有完全相同数据结构的数据表temp,并尝试向其中插入employee对象,oracle将会抛出错误提示。
SQL>create table temp as select * from tmp_employee where employee_id = 0;
create table temp as select * from tmp_employee where employee_id = 0用于创建新表temp,该表来源于表tmp_employee中所有employee_id为0的记录。很明显,此时将创建一个与表tmp_employee相同结构,但不含任何数据的数据表。
SQL>select * from temp;
需要注意的是,只有利用对象类型创建的数据表,才可以向表中插入对象。例如,可以首先创建一个与表tmp_employee具有完全相同数据结构数据表temp,并尝试向其中出入employee对象,oracle将会抛出错误提示。
(3)从数据到对象
数据表中的数据同样可以映射为对象实例。
例子:在PL/SQL中,可以对获得的对象进行一系列操作。例如,当前表tmp_employee中含有一条记录,那么,可以将其映射为employee对象。
SQL>declare e employee;
begin
select value(t) into e from tmp_employee t where employee_id = 1;
e.employee_id := e.employee_id + i;
insert into tmp_employee values(e);
end
--------------
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 + i用于将对象e的employee_id属性值增加1,此处与面向对象编程中的对象操作完全相同;insert into tmp_employee_values(e)再次向表tmp_employee中插入对象e。
在PL/SQL代码块成功执行之后,可以查看表tmp_employee中的数据,以验证操作是否成功。
分析查询结果可知,对象e被成功修改,修改后的数据被成功映射到数据表中。上图显示了数据映射为对象的实例流程。
(4)使用对象的好处
oracle中的对象数据实际仍然以关系数据的形势存储,但是,对象的特性,例如继承、封装等,都为开发人员提供了更加灵活的处理形式,同样,可以构造复杂的对象类型来封装复杂的多表查询。
另外,在应用程序开发过程中,使用对象传输数据,比普通查询数据的传输速率更高。
2、对象视图
对象类型在数据库编程中有许多好处,但有时,应用程序已经开发完成。为了迎合对象类型而重建数据表是不现实的,对象视图正是解决这个问题的优秀策略。
(1)创建对象视图
例子:创建一个对象视图,以代替对象表tmp_employee,相应的SQL语句如下所示。
SQL>create or replace view ov_employee of employee
with object oid(employee_id) as
select employee_id a_id, employee_name, employee_position from employees;
其中,create or replace view ov_employee of employee 用于创建视图ov_employee; of employee 表示该视图基于对象类型employee;with object oid (employee_id) 为对象视图指定了对象标识符,employee_id为对象类型employee中的属性employee_id;一旦指定了oid,那么将可以利用oracle内建数据类型FEF来引用对象;select 后面的则表示指定了视图ov_employee的数据源。
(2)查看对象视图信息
对象视图创建之后,同样可以在数据字典中获得其相应信息。利用oracle内置视图user_views可以获得对象视图ov_employee的相关信息。
SQL>select view_name,view_type from user_views
where view_name = 'VW_EMPLOYEES'
or view_name = 'OV_EMPLOYEE';
查询结果中,view_name列代表了视图名称;而view_type则代表了视图基于的对象类型。
分析查询结果可知,vw_employees的对象类型为空,这也正是关系视图的特征。ov_employee的对象类型为employee,表明该视图基于对象类型employee。
(3)查询对象视图
可以像查询关系视图那样查询视图ov_employee中的数据。
SQL>select * from ov_employee;
------------
对象视图的查询操作与关系视图完全相同。
例子:对于对象视图,可以利用value()函数获取记录到对象的映射。例如,在表salary中存储了员工工资信息,同时存储了员工ID的信息,创建一个新的视图vw_salary_employee来获得薪水及领取者的详细信息。
SQL>create or replace view vw_salary_employee as
select s.salary_id, s.month, s.salary,
value(o) e
from salary s, ov_employee o
where s.employee_id = o.employee_id;
create or replace view vw_salary_employee 用于创建关系视图 vw_salary_employee; value(o) e 用于获得employee对象实例,并制定别名e。
(4)更新对象视图
更新对象包括两方面的内容:插入数据和修改已有数据。其操作方式与关系视图完全相同,下面将以插入数据为例,来介绍对象视图的使用。
SQL>insert into ov_employee values( employee(6, '张三','测试工程师'));
其中,employee(6, '张三','测试工程师')用于实例化一个employee类型的对象,并可以在values中直接使用该对象来实现插入操作。
分析查询表employees及视图ov_employee来验证查询是否成功。
可以验证,通过对象视图,同样可以像基础表中插入数据,而此时的插入方式,则可以以对象实例的方式实现。