原创 杨廷琨 数据和云

编者按

 

云和恩墨大讲堂社群(本文底部有入群方式)里有人提出一个需求:一张表数据量很大,如何只导出其中一部分列?云和恩墨CTO、Oracle ACE总监、ACOUG核心专家杨廷琨老师使用了数据泵的方式,细致入微地解释了过程并给出具体的代码实现。数据和云(ID:OraNews)独家发布,以飨读者。

 

以下为正文

 

无论是老版本exp还是数据泵expdp,Oracle都提供了QUERY的功能,这使得查询表中部分记录的功能可以实现,但是QUERY只能过滤行,而不能过滤列,Oracle数据泵会读取表中全部列的。

 

在12c中,Oracle为数据泵提供了VIEW功能,使得导出的时候可以根据视图的定义来导出表中的数据:

 

(左右滑动查看代码部分,下同)

 

表已创建。

 

  •  
SQL>create view v_tables as select owner, table_name, tablespace_name from t_tableswhere owner not in ('SYS');

 

视图已创建。

 

利用数据泵的VIEWS_AS_TABLES参数可以直接导出视图对应的表数据:

细致入微:如何使用数据泵导出表的部分列数据_Java

 

 

警告: 连接到容器数据库的根或种子时通常不需要 Oracle Data Pump 操作。

细致入微:如何使用数据泵导出表的部分列数据_Java_02

 

 

虽然是通过视图导出的,但是数据泵把它当作一个表来处理,因此这个dump文件是可以直接导入到数据库中变成表的:

 

  •  
SQL>drop view v_tables;

 

视图已删除。

 

完成导入操作:

细致入微:如何使用数据泵导出表的部分列数据_Java_03

 

警告: 连接到容器数据库的根或种子时通常不需要 Oracle Data Pump 操作。

 

细致入微:如何使用数据泵导出表的部分列数据_Java_04

 

查询表数据:

细致入微:如何使用数据泵导出表的部分列数据_Java_05

 

这个功能是12c的特新特,如果是12c之前的版本,可以考虑使用ORACLE_DATAPUMP类型的外部表来实现:

细致入微:如何使用数据泵导出表的部分列数据_Java_06

 

 

表已创建。

 

通过将外部表导出的 external_table.dp 文件拷贝到目标环境对应的目录下,根据上面的定义重建外部表,注意目标环境创建过程由于已经拷贝了导出的数据,因此语法截至到 location 语句就结束了,不要再包含 as select 部分。

 

细致入微:如何使用数据泵导出表的部分列数据_Java_07

 

表已创建。

 

 

细致入微:如何使用数据泵导出表的部分列数据_Java_08

所以对于11g和10g的版本,也可以不通过新建表,然后拷贝数据的方式来实现数据的导出和转移。但是如果是9i及以前的版本,那么要不然通过建表然后exp导出的方式,要不然自己写程序实现数据的导出吧。