Oracle 创建外部表
找别人要一下数据,但是他发来一个 xxx.csv 文件,怎么办?
1、使用视图化工具导入
使用导入工具导入,如 DBeaver,右击要导入的表,选择导入数据。
选择对应的 csv 文件,下一步就行了(如果出现导入后乱码,可以考虑一下字符集的问题)。
但是,有时候数据量很大,几十上百万的数据的时候,就会出现加载到多少条就卡住不动了,这个时候,就可以考虑一下先创建一个临时的外部表。
2、 创建外部表
原表:
create table TEST.test01(user_name varchar2(32),age number(3,0),height number(4,1)
)
原数据:
csv 文件(不同的打开方式,显示的会不一样):
在 Oracle 数据库中,外部表是一种特殊类型的表,它并不将数据实际存储在数据库内部,而是提供了一种直接访问存储在数据库外部文件中数据的方式,就好像这些数据是存储在数据库表中一样。
1)创建逻辑目录(需DBA权限)
CREATE DIRECTORY restore AS 'D:\Oracle19c\restore';
2)授予用户对这个目录的读写权限
GRANT READ, WRITE ON DIRECTORY restore TO TEST;
3)创建外部表
上面的建表语句就跟原始表一样就行。
CREATE TABLE TEST.test02 (user_name varchar2(32),age number(3,0),height number(4,1)
)
ORGANIZATION external (type oracle_loaderdefault directory restoreaccess parameters(records delimited by newlineskip 1badfile 'bad.txt'logfile 'log.txt'fields terminated by ","ENCLOSED BY '"'missing field values are null)location('test.csv')
);
注释:
ORGANIZATION external :创建外部表的组织部分,指定外部表的相关属性
type oracle_loader:指定外部表的类型为 oracle_loader,这是 Oracle 提供的用于加载外部数据的接口类型
default directory restore:指定默认的目录对象,该目录对象需要提前创建,用于指定外部文件所在的路径
access parameters: 定义访问外部文件的参数,这些参数告诉 Oracle 如何读取外部文件
records delimited by newline:指定记录的分隔符为换行符,意味着每一行就是一个记录
skip 1:跳过文件的第一行,通常用于跳过表头
badfile 'bad.txt':指定坏文件的名称,当在加载数据过程中遇到不符合规则的数据时,这些数据会被记录到该文件中
logfile 'log.txt':指定日志文件的名称,在加载数据过程中的详细信息,如错误信息、处理进度等会被记录到该文件中
fields terminated by ",":指定字段之间的分隔符为逗号,即文件中每一行的数据是通过逗号来分隔不同字段的
ENCLOSED BY '"':指定字段值是被双引号包围的,当字段值中包含分隔符或特殊字符时,使用双引号可以正确解析字段值
missing field values are null:当某个字段的值缺失时,将其视为 NULL 值
location('test.csv'):指定外部文件的位置,这里的文件名是 test.csv,文件应位于 restore 目录对象所指向的路径下
提示:这里要把 csv 文件放到刚才创建的逻辑目录对应的实际目录下。
3)建立好之后,查询可能会提示
只需要在查询前执行以下这句话,修改 Oracle 外部表(TEST.test02
)的拒绝限制设置。
ALTER TABLE TEST.test02 reject LIMIT unlimited;
再进行查询,就没问题了。
select * from TEST.test02;
然后再把这个表的数据迁到你想要还原的表里。