本文是參照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.
可是外部文件還在,也許是爲了安全吧。