Oracle 基礎 ----臨時表和物件表

tieshuai發表於2008-03-04

  Oracle 基礎 ----臨時表和物件

 

臨時表,只有當使用者向表中新增資料時, 才會為其分配儲存空間,而且為臨時表分配的空間來自臨時表空間。

 

建立會話級別臨時表:

SYS AS SYSDBA on 2008-03-03 15:33:14 at ORCL>edit

已將 file afiedt.buf 寫入

 

  1  create global temporary table session_table(

  2  id number,

  3  op varchar2(50),

  4  op_date date)

  5* on commit preserve rows

SYS AS SYSDBA on 2008-03-03 15:33:27 at ORCL>/

 

已建立表格.

 

建立事務級別臨時表。

SYS AS SYSDBA on 2008-03-03 15:34:50 at ORCL>edit

已將 file afiedt.buf 寫入

 

  1  create global temporary table transaction_table(

  2   id number,

  3   op varchar2(50),

  4   op_date date)

  5* on commit delete rows

SYS AS SYSDBA on 2008-03-03 15:34:59 at ORCL>/

 

已建立表格.

 

物件和物件表

物件型別和之前的自定義資料型別不同,它還可以為其定義函式和過程作為其方法, 個人侷的相當於java 中的class

 

SYS AS SYSDBA on 2008-03-03 15:35:00 at ORCL>create or replace type person as object(

  2  name varchar2(10),

  3  sex char(2),

  4  date_of_birth date,

  5  native_place varchar2(100)

  6  );

  7  /

 

已建立型別.

 

物件型別的名稱必須是唯一的,屬性不可以是以下型別:

1: Long long raw.

2: rowed

3: pl/sql特定型別, 如:binary_integer,    Boolean,  %type,  %rowtype等。

4:程式包中定義的資料型別。

 

 

建構函式:

SYS AS SYSDBA on 2008-03-03 15:59:13 at ORCL>declare

  2   person_one person;

  3  begin

  4   person_one:=person('d','d',date'181-09-02','bj');

  5  dbms_output.put_line(person_one.name);

  6  end;

  7  /

PL/SQL 程式順利完成.

 

引用物件型別:

SYS AS SYSDBA on 2008-03-04 08:50:37 at ORCL>edit

已將 file afiedt.buf 寫入

  1  create table employee(

  2  individual_info person,

  3  emp_id number,

  4* dep_Id number)

SYS AS SYSDBA on 2008-03-04 08:51:05 at ORCL>/

 

已建立表格.

 

SYS AS SYSDBA on 2008-03-04 08:52:53 at ORCL>edit

已將 file afiedt.buf 寫入

 

  1  declare

  2   person_one person;

  3  begin

  4   person_one:=person('liu','n',date'1982-08-01','bj');

  5   insert into employee(individual_info,emp_id,dep_id)

  6   values(person_one,123,45);

  7* end;

SYS AS SYSDBA on 2008-03-04 08:55:08 at ORCL>/

 

PL/SQL 程式順利完成.

 

SYS AS SYSDBA on 2008-03-04 08:55:12 at ORCL>select e.emp_id,e.individual_info.name from emplo

yee e;

 

    EMP_ID INDIVIDUAL

---------- ----------

       123 liu

 

在訪問物件中單獨的屬性時,必須使用表列名。

 

例項方法和類方法:

SYS AS SYSDBA on 2008-03-04 09:17:33 at ORCL>create or replace type person as object(

  2   name varchar2(10),

  3   sex char(2),

  4   date_of_birth date,

  5   native_place varchar2(100),

  6   member procedure change_name(name varchar2),

  7   static function new(v_name varchar2,v_sex char) return person);

  8  /

已建立型別.

SYS AS SYSDBA on 2008-03-04 09:20:14 at ORCL>create or replace type body person is

  2   member procedure change_name(name varchar2) is

  3   begin

  4       self.name:=name;

  5  end change_name;

  6  static function new(v_name varchar2,v_sex char) return person

  7  is

  8  begin

  9      return(person(v_name,v_sex,date'1982-2-12','shanghai'));

 10  end new;

 11  end;

 12  /

 

已建立型別主體.

 

SYS AS SYSDBA on 2008-03-04 09:33:12 at ORCL>declare

  2   person_one person;

  3  begin

  4    person_one:=person('liu','n',date'1982-01-1','beijing');

  5    person_one.change_name('lili');

  6    dbms_output.put_line(person_one.name);

  7  end;

  8  /

 

PL/SQL 程式順利完成.

 

對映方法:

SYS AS SYSDBA on 2008-03-04 10:07:03 at ORCL>edit

已將 file afiedt.buf 寫入

 

  1  create or replace type body person is

  2     member procedure change_name(name varchar2) is

  3     begin

  4         self.name:=name;

  5     end change_name;

  6    static function new(v_name varchar2,v_sex char) return person is

  7    begin

  8       return(person(v_name,v_sex,date'1982-01-01','shanghai'));

  9    end new;

 10    map member function compare return date is

 11    begin

 12     return self.date_of_birth;

 13    end compare;

 14* end;

SYS AS SYSDBA on 2008-03-04 10:09:40 at ORCL>/

 

已建立型別主體.

 

SYS AS SYSDBA on 2008-03-04 10:13:33 at ORCL>edit

已將 file afiedt.buf 寫入

 

  1  declare

  2  person_one person;

  3  person_two person;

  4  begin

  5      person_one:=person.new('liu','n');

  6      person_two:=person('wang','n',date'1982-2-2',null);

  7     if person_one

  8         dbms_output.put_line('liu');

  9     elsif person_one=person_two then

 10        dbms_output.put_Line('=');

 11     else

 12         dbms_output.put_line('wang');

 13     end if;

 14* end;

 15  /

liu

 

PL/SQL 程式順利完成.

 

排序方法:使用order 代替 對映方法中的 map,其餘一致。

在宣告order 方法時,order方法的引數型別要和self型別一致,且只可以為函式。建構函式,MAP方法和ORDER方法在物件型別內只允許定義一次。

 

 

MAP方法和ORDER方法都有能力在sql 或PL/SQL中,針對物件進行比較,當排序或者合併大量的物件時,MAP方法具有效率方面的優勢,因為它把每個物件對映為單個標量值,然後根據標量值進行處理。

order 方法一次只能比較2個值,所以必須反復呼叫order方法才能夠處理比較大的資料集合。

 

 

繼承:

 當一個子類物件的例項被賦給一個父型別的變數時,父類變數只可以訪問父類中定義的那一部份,因為父類不知道子類增加的屬性。

 在重寫(覆蓋)時一個方法時,子類賦給父類後,父類呼叫子類的方法。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/701141/viewspace-199379/,如需轉載,請註明出處,否則將追究法律責任。

相關文章