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 = '&name';
dbms_output.put_line('sex is '||person.gender);
建立的列對象的表,檢索資料的時候一樣要将隻放到類對象變量中
person2 person_type1;
select person,sal into person2,salary from emp where empno='&no';
v_person person_type2;
select person into v_person from employee_tab2
where eno=&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