1. 程式人生 > 其它 >外部表簡單總結(r3筆記第51天)

外部表簡單總結(r3筆記第51天)

對於外部表的使用而言,可能是既陌生又熟悉的感覺,說陌生可能自己真正的使用機會要少一些,而熟悉可能是大家比較常用的通過外部表來檢視資料庫日誌,其實外部表還有更豐富的內容。 當然了外部表的使用都是基於目錄來實現的。外部表呼叫的引擎有兩個,一個oracle_datapump引擎,一個是oracle_loader引擎,在使用中和datapump,sql*loader都是有一定的關聯的。 比如下面的例子。 我們需要匯出emplyees中的資料,就可以使用如下的方式。基本是做資料的匯出的情況比較多。匯出檔案為emp.data

create table hr.ext_emp organization external
(type oracle_datapump
 default directory  ext_dir
 location('emp.data')
)as
select * from hr.employees;

在上面的基礎上,如果我們想根據employees表的salary匯出一個dump檔案emp.data,下面的方式就很有優勢。

create  table hr.extp_emp organization external
(type oracle_datapump
 default directory  ext_dir
 location('emp.dmp')
) as select * from hr.employees where  salary>10000;

然後我們循序漸進,直接根據得到的dump檔案emp.data來載入為一個全新的外部表。 比如我們需要一個全新的外部表,需要得到emp.data中的資料。可以使用如下的方式。

create  table hr.extp2_emp(employee_id  number(6),first_name varchar2(20)) organization external
(type oracle_datapump
 default directory  ext_dir
 location('emp.dmp')
) ;

這樣就可以直接從外部表extp2_emp中直接訪問dump emp.data中的資料了。 以上是使用oracle_datapump的一些常用例項。 對於oracle_loader來說,效果相比sql*loader也毫不遜色。資料的載入上也很靈活。 如果我們想得到10g資料庫版本中的資料庫日誌資訊,可以參考下面的方式。 首先得到資料庫日誌的路徑,然後建立對應的目錄結構。然後直接把資料庫日誌檔案以行的形式載入,生成一個只讀的表。日誌中的每一行在資料庫中都是一行記錄。

create  directory alert_dir as '/u01/app/oracle/admin/PODD/bdump';
grant read,write  on directory alert_dir to hr;
create table hr.alert_log(text varchar2(1000)) organization external
(type  oracle_loader
 default  directory alert_dir
 location('alert_PODD.log')
);

如果在實際的應用中可能有更為複雜的情況。 比如我們需要一個只讀表emp_load,來讀取info.dat中的資料,可能對於資料型別的轉換而言。需要做一些額外的轉換工作,oracle_loader就是一個不錯的選擇。 我們要載入Info.dat的資料,要轉換的資料型別等就可以類似下面的例子。

CREATE  TABLE hr.emp_load
      (employee_number      CHAR(5),
        employee_dob         CHAR(20),
       employee_last_name    CHAR(20),
       employee_first_name  CHAR(15),
        employee_middle_name CHAR(15),
       employee_hire_date   DATE)
     ORGANIZATION EXTERNAL
      (TYPE ORACLE_LOADER
      DEFAULT  DIRECTORY ext_dir
      ACCESS PARAMETERS
        (RECORDS DELIMITED BY  NEWLINE
         FIELDS (employee_number      CHAR(2),
                  employee_dob         CHAR(20),
                 employee_last_name    CHAR(18),
                 employee_first_name  CHAR(11),
                  employee_middle_name CHAR(11),
                 employee_hire_date   CHAR(10)  date_format DATE mask "mm/dd/yyyy"
                )
        )
       LOCATION ('info.dat')
     );