Oracle外部表支持两种类型的驱动:一种是ORACLE_LOADER,外部表的数据必须来源于文件文件,另一种则是ORACLE_DATAPUMP,外部表的

同事最近在忙数据一致性比对工作,需要对不同文本文件中的数据进行比对,有的文件较大,记录较多,如果用普通的文本编辑器打开的话,很显然,会很卡,甚至打不开。

基于此,可将该文本文件的数据导入到数据库中,在集合的层面进行比对。

那么如何将文本文件的数据导入到数据库中呢?在这里,主要利用了Oracle的外部表特性。

Oracle外部表支持两种类型的驱动:一种是ORACLE_LOADER,外部表的数据必须来源于文件文件,另一种则是ORACLE_DATAPUMP,外部表的数据必须是二进制dump文件,该dump文件是先前将Oracle内部表的数据导入到外部表中填充的文件。很显然,Oracle希望将数据保留在数据库内部进行处理。

首先,我们来看一下该文本文件的大小及记录。

[oracle@node2 ~]$ du -sm P_20150626010000_2002371.0003479598

274 P_20150626010000_2002371.0003479598[oracle@node2~]$ wc -l P_20150626010000_2002371.0003479598

2899265 P_20150626010000_2002371.0003479598

从上面的输出可以看出,该文件274M,有2899265条记录。

其次,构建创建外部表语句。

CREATE TABLEemp_load

(subsidnumber(18),

servnumberVARCHAR2(20 CHAR),

subsprodidNUMBER(18),

prodidVARCHAR2(32 CHAR),

startdate date,

enddate date,

ownerVARCHAR2(4 CHAR))

ORGANIZATION EXTERNAL

(TYPE ORACLE_LOADERDEFAULTDIRECTORY tmp

ACCESS PARAMETERS

(RECORDS DELIMITEDBYNEWLINE

FIELDS TERMINATEDBY "|"

( subsidDECIMALEXTERNAL,

servnumberCHAR(20),

subsprodidDECIMALEXTERNAL,

prodidCHAR(32),

startdate date "yyyymmddhh24miss",

enddate date "yyyymmddhh24miss",

ownerCHAR(4)

)

)

LOCATION ()

);

注意,目录tmp必须存在,因为我是在scott用户下执行的,所以scott用户必须对该路径有读写权限。

第三、在scott用户下执行该建表语句。

第四、查看生成的外部表是否有问题

SQL(*) fromemp_load;COUNT(*)

记录与wc-l查看的记录数吻合。

注意,建表过程中没有报错并不一定意味着数据已经成功加载在外部表中。必须通过查询外部表来判定数据是否已成功加载,倘若有错误提示,可参看当前目录下生成的日志文件,具体在本例中,是EMP_LOAD_2000.bad和EMP_LOAD_2000.log。

当然,外部表中的数据只能查询,不能做DML操作,譬如,随机删除表中的一条数据

SQLemp_load where rownum=1;ERROR at line1:

ORA-30657: operation not supported on external organized table

如果想对该外部表数据进行DML操作,可先将外部表的数据导入到内部表中。具体步骤如下:

SQLtest emp_load ;Tablecreated.test emp_load;2899265rows created.

Elapsed:00:01:00.29SQLtest where rownum<=100;test ERROR at line1:

ORAmodify an object after modifying it inparallel;Commitcomplete.SQLtest where rownum<=100;

在这里,为了节省时间,我用了直接路径插入,可以看出,插入近300万数据,只用了1分左右的时间,考虑到我虚拟机上的数据库,只给它分配了300M的内存,加载的效率还是相当可观的。

SQL>show parameter memory

NAME

TYPE

VALUE------------------------------------ ----------- ------------------------------

hi_shared_memory_address

integer

0memory_max_target

biginteger300M

memory_target

biginteger300M

shared_memory_addressinteger

0

后来,测试了一下传统路径插入所消耗的时间,为了和直接路径插入进行比较,剔除SQL解析,data buffer等因素的影响,清空了共享池和buffer cache,具体如下:

SQL> conn /assysdba

Connected.

SQL> altersystem flush shared_pool;

System altered.

SQL> altersystem flush buffer_cache;

System altered.

SQL> conn scott/tiger

Connected.

SQL> set timing onSQLtest emp_load;2899265rows created.

Elapsed:00:01:05.36

用传统路径插入(即会产生redo日志),耗时1分5秒,相对于直接路径插入,两者效率相差不大,看来还是数据量较小,不能明显的体现直接路径插入速度上的优势。

注意:在SQL*PLUS中,,number字段的输出默认为10,这样会导致对于937116510102250300这样的数值,可能会显示为9.3712E+17,在这里,可通过set numwidth 18来显示完整的number字段的值。

本文永久更新链接地址:

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

外部表如何导入mysql_如何利用Oracle外部表导入文本文件的数据相关推荐

  1. Oracle数据库查看表空间sql语句、查看Oracle数据库表空间剩余 、修改表空间、库备份

    一  Oracle数据库查看表空间sql语句 1.oracle查看表空间当前用户 SQL>  select  username,default_tablespace  from user_use ...

  2. oracle外部表使用详解,详解Oracle外部表的一次维护(图文)

    在做Oracle数据库的导出导入操作的时候,发现在将导出数据导入到新库过程中报告如下错误: 在查看数据库中关于外部表的视图中相关信息:select * from dba_directoriesSele ...

  3. oracle定时导入dat文件夹,oracle dat文件导入 | 学步园

    今天在执行dat文件导入的时候,由于很久没执行过这种操作了,因此又变得生疏了,花了比较长的时间才弄好.然后看到网上关于oracle dat文件的导入介绍的都是一部分,所以特在这里总结一下. 一.dmp ...

  4. yspider爬取数据导入mysql_爬虫实战四、PyCharm+Scrapy爬取数据并存入MySQL

    一.创建爬虫项目 注意:不能直接使用PyCharm创建Scrapy项目,所以需要在爬虫实战三.PyCharm搭建Scrapy开发调试环境的基础(PyCharm配置完Scrapy)之上,选中mySpid ...

  5. oracle 表删掉了_分区,Oracle 删除表分区

    Oracle 删除表分区 删除表分区 作者: 来源: 发布日期:2008-05-23 删除表分区(drop partition) 删除表分区包含两种操作,分别是: Ø 删除分区:alter table ...

  6. oracle通过表空间文件进行数据库恢复,Oracle数据库表空间恢复方案_oracle

    一. 用户表空间 错误: 在启动数据库时出现ORA-01157,ORA-01110或操作系统级错误例如ORA-07360,在关闭数据库(使用shutdown normal或shutdown immed ...

  7. oracle数据如何导入pg库,【oracle数据库如何导入到pg库中】-其它论坛-ZOL中关村在线...

    使用squirrel的db copy功能:选择多个表 copy paste, 可以跨多种数据库(基本上可以支持jdbc连接的数据库都可以,我只试下oracle postgresql),不错,就是它了, ...

  8. java监控表变化_关于实时监控oracle数据库表数据变化的设计与实现

    近期接受项目需求,需要实时处理oracle数据库中表的数据变化,首先想到的是在程序中创建定时器,轮询表.鉴于程序冗余考虑,百度知:oracle数据库java存储过程.Oracle数据库有执行简单jav ...

  9. oracle数据库扩大表空间,[小技巧]手工扩大Oracle数据库表空间的方法

    1.首先查看表空间的名字和所属文件select tablespace_name, file_id, file_name,round(bytes/(1024*1024),0) total_spacefr ...

最新文章

  1. LeetCode Python题解(二)----排序
  2. Aras学习笔记(1)学习Aras已半年有余,也积攒一些学习笔记,今天起会陆续分享出来,有兴趣的朋友一起交流...
  3. 十、分享一道LeetCode较为简单的单链表题,但是却能激发起练习算法的极大的兴趣
  4. Struts2+Spring2.5+Hibernate3.1实现登陆示例
  5. k8s组件批量启动、查看状态
  6. 基础设备----笔记
  7. 【快速安装Docker服务及Docker配置、Docker常用命令。】
  8. Selenium WebDriver之JavaScript
  9. 行内块 块级元素 行内元素
  10. amazeui PHP,amazeui页面分析之登录页面
  11. Android 自定义软键盘实现 数字九宫格
  12. Unity 时装换色
  13. .Net 面试题整理(一)
  14. 华师大网络学院计算机,华师大网络学院计算机原理作业.doc
  15. python练习(4)
  16. word2010 标尺游标的微调
  17. java 视频抽帧和gif 工具
  18. bmap、百度地图自定义画矩形
  19. (转)搜狗浏览器收藏夹文件恢复
  20. android暂停或停止其他音乐播放器的播放

热门文章

  1. windows和linux运算结果不同,从Windows和Linux读取文件会产生不同的结果(字符编码?)...
  2. SpringBatch适配器详解
  3. kafka describe topic
  4. 【网址收藏】linux namespace和cgroup
  5. maven版本控制实战
  6. Scala AKKA入门示例
  7. Scala数组和Java集合List的互转
  8. Python3 解释执行字符串类型的代码
  9. Scala代码案例:求ax2+bx+c=0方程的根
  10. Python Django 原生SQL查询(游标Cursor)