Oracle 中的OOP概念對象類型,可變數組,嵌套表,對象表,對象視圖                                                                                            對象類型: 優點:1)  更輕易與java, C++編寫的對象應用程序交互2)  獲取便捷。一次對象類型請求就可以從多個關系表中獲取信息,通過一次網絡往復即可返回 語法:CREATE [OR REPLACE] TYPE type_name{{AS IS } OBJECT  UNDER super_type}{       attribute_name datatype[,attribute_name datatype]… ---成員變量       [{MAP  ORDER} MEMBER function_name,]   ---排序函數       [{FINAL  NOT FINAL} MEMBER function_name,]  ---可否繼續的成員函數       [{INSTANTIABLE  NOT INSTANTIABLE } MEMBER function_name,]       ---可否實例化的成員函數       [{MEMBER  STATIC } function_name,]     ---靜態、非靜態成員函數}[{FINAL  NOT FINAL}]     ---對象可否繼續[{INSTANTIABLE  NOT INSTANTIABLE }]    ---對象可否實例化/ 對象類型的主體部分(即函數的實現部分,可選的):CREATE [OR REPLACE] TYPE BODY type_name {AS IS }                           [{MAP  ORDER} MEMBER function_body,]   ---排序函數       [{MEMBER  STATIC } function_name,]     ---靜態、非靜態成員函數END;/
                          例如:create or replace type person as object(       first_name varchar2(100),       last_name varchar2(100))/ 屬性類型可以是任何oracle 數據類型(包括自定義),除了如下:LONG和LONG RAWNCHAR、NCLOB 、NVARCHAR2ROWID、UROWIDPL/SQL的特定類型:%TYPE  %ROWTYPE  查看:Desc person  構造函數:set serveroutput on declare       l_person personbegin       l_person := person(‘Donny’,’Chen’);       dbms_output.putline(l_person.first_name);end;/ 構造函數要接受對象類型的所有屬性作為參數。因為這些參數沒有默認值,即使是null,也要提供。舉例: 表中的對象類型:對象類型可以作為數據庫中的列,所以稱為列對象create table person_table(       name person,       age number)/ set desc depth alldesc person_table
                          set desc depth 1 插入數據:insert into person_table       values(person(‘Donny’,’Chen’),30); declare       l_person personbegin       l_person := person(‘Hua’,’Li’);       insert into person_table values(l_person,33);end;/ 查詢數據:select * from person_table訪問對象類型的各個屬性:select p.name.first_name       from person_table p/ 為避免名稱解析問題,要求查詢對象類型的屬性的時候,使用表別名。否則報錯,舉例: 對象中的對象(合成):create or replacetype employee as object(       name person,       empno number,       hiredate date)/ 修改和刪除對象:9i之前,當建立的對象類型,以及依靠于此類型的對象或表之后,就無法再修改此對象類型了(增加刪除屬性和成員函數)。唯一的辦法是撤銷所有以來,即刪除依靠于此類型的對象或表。 9i新特性,可以修改被以來的對象類型,成為類型演化。有兩種方法:INVALIDATE 和 CASCADE INVALIDATE比如:desc person_table改變person類型,增加新屬性ssnalter type person       add attribute ssn varchar2(11) INVALIDATE;
                          desc person   (bug可能需要新開一個session) INVALIDATE選項使的所有依靠于person類型的對象和表標記為INVALID,比如:Desc person_table 需要手工驗證person_table:alter table person_table upgrade including data;desc person_tableupgrade including data表示根據新類型,物理上更新現有的數據的結構,ssn 置為null。也可以upgrade not including data,不更新原有數據的結構。Dml訪問person實例數據的時候再更新。Select * from person_table     CASCADE比如:alter type personadd attribute dob datecascade not including table data/ 不用手工驗證依靠此對象類型的表,由數據庫自動驗證。 Desc personDesc person_table 因為not including table data,沒有更新原有數據:select * from person_table 刪除類型:force   方法:即對象中的過程和函數,3種類型:STATIC: 只能夠在對象類型上調用,不專屬于某個實例。MEMBER: 專屬于某個特定的實例CONSTRUCTOR: 構造函數
                          create or replacetype employee as object(       name person,       empno number,       hiredate date,       sal number,       commission number,       member function total_compensation return number,       static function new(p_empno number,                            p_person person) return employee)/ desc employee 在類型主體實現這兩個方法:create or replacetype body employee as        member function total_compensation return number is       begin               return nvl(self.sal,0) + nvl(self.commission, 0);       end;       static function new(p_empno number,                            p_person person) return employee is        begin               return employee(p_person,p_empno,sysdate,10000,null);       end;end;/
                           比較抽象數據類型的數據:declare       l_employee1 employee;       l_employee2 employee;begin       l_employee1 :=employee.new(12345,null);       l_employee2 :=employee.new(67890,null);       if l_employee1= l_employee2 then              dbms_output.line_put(“They are equal”);       end if;end;/ 使用map指定具體比較哪些屬性:create or replacetype employee as object(       name person,       empno number,       hiredate date,       sal number,       commission number,       map member function convert return number)/ create or replacetype body employee as        map member function convert return number is       begin               return self.empno;       end;end;/
                           再比較:declare       l_employee1 employee;       l_employee2 employee;begin       l_employee1 :=employee.new(12345,null);       l_employee2 :=employee.new(67890,null);       if l_employee1= l_employee2 then              dbms_output.line_put(“They are equal”);       end if;       if l_employee1> l_employee2 then              dbms_output.line_put(“employee1 is greater”);       end if;       if l_employee1< l_employee2 then              dbms_output.line_put(“employee2 is greater”);       end if;end;/ Order 方法:create or replacetype employee as object(       name person,       empno number,       hiredate date,       sal number,       commission number,       order member function match(p_employee employee) return integer)/
                          create or replacetype body employee as        order member function match(p_employee employee) return integer is       begin               if self.empno> p_employee.empno then       return 1;              elseif self.empno< p_employee.empno then              return -1;       else               return 0;       end if;       end;end;/繼續:FINAL / NOT FINAL
對象默認FINAL,表示不可以被繼續;MEMBER方法也能指定是否FINAL,表示能否在子類中對他進行覆寫。默認NOT FINAL Create or replace type super_type as object(       N number,       Final member PRocedure cannot_override)not final/  更多內容請看Oracle 10g基礎應用  Oracle基礎專題,或