使用Oracle External Tables实现数据库直接读取文本文件

具体需求:将一个txt文件,导入到oracle数据库
解决思路:使用Oracle External Tables
操作步骤:
1)确认txt的数据,明确数据字段类型
[oracle@hammer ~]$ cat sh_sales.dat
20201215001|02|2020/12/15|aa|98|36|1000|3000|9999
可以看出,各个字段用“|”隔离,第三列为日期型数据,第四列为字符型,其他均为数字型,其中后三列需要保留2位小数点
2)确认txt的路径
[oracle@hammer ~]$ pwd
/home/oracle
3)创建DIRECTORY
CREATE OR REPLACE DIRECTORY data_file_dir AS '/home/oracle';
GRANT WRITE ON DIRECTORY data_file_dir TO public;
4)创建外部表sales_transactions_ext
conn system/xxxxxx
CREATE TABLE sales_transactions_ext
(PROD_ID NUMBER,
CUST_ID NUMBER,
TIME_ID DATE,
CHANNEL_ID varchar2(20),
PROMO_ID NUMBER,
QUANTITY_SOLD NUMBER,
AMOUNT_SOLD NUMBER(10,2),
UNIT_COST NUMBER(10,2),
UNIT_PRICE NUMBER(10,2))
ORGANIZATION external
(TYPE oracle_loader
DEFAULT DIRECTORY data_file_dir
ACCESS PARAMETERS
(RECORDS DELIMITED BY NEWLINE
CHARACTERSET US7ASCII
BADFILE data_file_dir:'sh_sales.bad_xt'
LOGFILE data_file_dir:'sh_sales.log_xt'
FIELDS TERMINATED BY "|" LDRTRIM
( PROD_ID,
CUST_ID,
TIME_ID DATE(10) "YYYY/MM/DD",
CHANNEL_ID,
PROMO_ID,
QUANTITY_SOLD,
AMOUNT_SOLD,
UNIT_COST,
UNIT_PRICE))
location ('sh_sales.dat')
)REJECT LIMIT UNLIMITED;

5)验证
select * from system.sales_transactions_ext;
file

注:

  1. 文件目录和日志目录可以是不同的路径,也就是多建几个DIRECTORY,本实验为了方便统一成一个
  2. TXT文件若采用其他符号作为分隔符,可以在建表语句的这个位置进行修改FIELDS TERMINATED BY "|" LDRTRIM,把|改为实际的分隔符,比如空格或者,什么的
  3. 官方文档里提到的实验,还多个解压的操作,实际情况不会那么骚,本实验就简化了。具体可以参考文章末尾看下官档。
  4. 外部文件是只读的

可参考11g官方文档
Administrator's Guide-->20 Managing Tables-->Managing External Tables

Related Posts