天天看點

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方法差別還是不太明白,有懂得留個言

<a href="http://www.cnblogs.com/lanzi/archive/2011/03/30/1999790.html" target="_blank">http://www.cnblogs.com/lanzi/archive/2011/03/30/1999790.html</a>

對象表是包含對象類型的表 有兩種術語,列對象行對象

一個是行對象,即類型存儲的資料做為一行

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)

);

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;

v_info varchar2(100);

v_info:='姓名:'||name||',出生日期'||birthdate;

return v_info;

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;

select vlue(p) into person from emp p

where p.name = '&amp;name';

dbms_output.put_line('sex is '||person.gender);

建立的列對象的表,檢索資料的時候一樣要将隻放到類對象變量中

person2 person_type1;

select person,sal into person2,salary from emp where empno='&amp;no';

v_person person_type2;

select person into v_person from employee_tab2

where eno=&amp;no;

v_person.change_address('aaaa'); 執行個體通路的原資料

dbms_output.put_line(v_person.get_info);  執行個體通路的

這個對象類型還有一個比較惡心的就是比如我用了列對象建立了表,那麼我通路裡邊的資料的時候就比較麻煩,使用的時候注意

比如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

繼續閱讀