通過SELECT語句創建外部表

本文是參照Create External Table as Select所做的實驗過程,,感謝作者Roger Macnicol。

在Oracle中,可以很方便的利用SELECT語句從內部表創建外部表。
本實驗中,我的內部表爲lineorder,恰好是通過sqlldr導入的,然後我們創建外部表:

connect sys/Welcome1@orclpdb1 as sysdba
create directory extdir as '/home/oracle/labs';
grant read, write on directory extdir to oe;
connect oe/password@orclpdb1
create table cet_test organization external
(
  type ORACLE_DATAPUMP
  default directory extdir
  location ('xt_test01.dmp','xt_test02.dmp')
) parallel 2
as select * from lineorder;

好了我們來看一下外部生成的數據,數據量和sqlldr使用的差不多:

-- select * 生成的數據
$ ll xt*
-rw-r-----. 1 oracle oinstall 100220928 Feb 21 15:29 xt_test01.dmp
-rw-r-----. 1 oracle oinstall  68292608 Feb 21 15:29 xt_test02.dmp
-- sqlldr導入時使用的數據
$ ll *.tbl
-rw-r--r--. 1 oracle oinstall 99340750 Feb 19 00:14 lineorder2.tbl
-rw-r--r--. 1 oracle oinstall 69573946 Feb 19 00:02 lineorder.tbl

看一下外部表的數據:

SQL> desc cet_test
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 LO_ORDERKEY                                        NUMBER
 LO_LINENUMBER                                      NUMBER
 LO_CUSTKEY                                         NUMBER
 LO_PARTKEY                                         NUMBER
 LO_SUPPKEY                                         NUMBER
 LO_ORDERDATE                                       NUMBER
 LO_ORDERPRIORITY                                   CHAR(15)
 LO_SHIPPRIORITY                                    CHAR(1)
 LO_QUANTITY                                        NUMBER
 LO_EXTENDEDPRICE                                   NUMBER
 LO_ORDTOTALPRICE                                   NUMBER
 LO_DISCOUNT                                        NUMBER
 LO_REVENUE                                         NUMBER
 LO_SUPPLYCOST                                      NUMBER
 LO_TAX                                             NUMBER
 LO_COMMITDATE                                      NUMBER
 LO_SHIPMODE                                        CHAR(10)

SQL> select count(*) from cet_test;

  COUNT(*)
----------
   1702430

看錶的定義:

SQL> 
set long 100000
set pages 999
select dbms_metadata.get_ddl('TABLE', 'CET_TEST') from dual;

DBMS_METADATA.GET_DDL('TABLE','CET_TEST')
--------------------------------------------------------------------------------

  CREATE TABLE "OE"."CET_TEST"
   (    "LO_ORDERKEY" NUMBER,
        "LO_LINENUMBER" NUMBER,
        "LO_CUSTKEY" NUMBER,
        "LO_PARTKEY" NUMBER,
        "LO_SUPPKEY" NUMBER,
        "LO_ORDERDATE" NUMBER,
        "LO_ORDERPRIORITY" CHAR(15),
        "LO_SHIPPRIORITY" CHAR(1),
        "LO_QUANTITY" NUMBER,
        "LO_EXTENDEDPRICE" NUMBER,
        "LO_ORDTOTALPRICE" NUMBER,
        "LO_DISCOUNT" NUMBER,
        "LO_REVENUE" NUMBER,
        "LO_SUPPLYCOST" NUMBER,
        "LO_TAX" NUMBER,
        "LO_COMMITDATE" NUMBER,
        "LO_SHIPMODE" CHAR(10)
   )
   ORGANIZATION EXTERNAL
    ( TYPE ORACLE_DATAPUMP
      DEFAULT DIRECTORY "EXTDIR"

      LOCATION
       ( 'xt_test01.dmp',
         'xt_test02.dmp'
       )
    )
   REJECT LIMIT 0
  PARALLEL 2

最後刪除外部表,連帶刪除外部生成的文件:

SQL> drop table cet_test purge;

Table dropped.

可是外部文件還在,也許是爲了安全吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章