【數據庫】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來驗證查詢是否成功。


可以驗證,通過對象視圖,同樣可以像基礎表中插入數據,而此時的插入方式,則可以以對象實例的方式實現。




發佈了53 篇原創文章 · 獲贊 12 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章