外部表如何导入mysql_如何利用Oracle外部表导入文本文件的数据
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外部表导入文本文件的数据相关推荐
- Oracle数据库查看表空间sql语句、查看Oracle数据库表空间剩余 、修改表空间、库备份
一 Oracle数据库查看表空间sql语句 1.oracle查看表空间当前用户 SQL> select username,default_tablespace from user_use ...
- oracle外部表使用详解,详解Oracle外部表的一次维护(图文)
在做Oracle数据库的导出导入操作的时候,发现在将导出数据导入到新库过程中报告如下错误: 在查看数据库中关于外部表的视图中相关信息:select * from dba_directoriesSele ...
- oracle定时导入dat文件夹,oracle dat文件导入 | 学步园
今天在执行dat文件导入的时候,由于很久没执行过这种操作了,因此又变得生疏了,花了比较长的时间才弄好.然后看到网上关于oracle dat文件的导入介绍的都是一部分,所以特在这里总结一下. 一.dmp ...
- yspider爬取数据导入mysql_爬虫实战四、PyCharm+Scrapy爬取数据并存入MySQL
一.创建爬虫项目 注意:不能直接使用PyCharm创建Scrapy项目,所以需要在爬虫实战三.PyCharm搭建Scrapy开发调试环境的基础(PyCharm配置完Scrapy)之上,选中mySpid ...
- oracle 表删掉了_分区,Oracle 删除表分区
Oracle 删除表分区 删除表分区 作者: 来源: 发布日期:2008-05-23 删除表分区(drop partition) 删除表分区包含两种操作,分别是: Ø 删除分区:alter table ...
- oracle通过表空间文件进行数据库恢复,Oracle数据库表空间恢复方案_oracle
一. 用户表空间 错误: 在启动数据库时出现ORA-01157,ORA-01110或操作系统级错误例如ORA-07360,在关闭数据库(使用shutdown normal或shutdown immed ...
- oracle数据如何导入pg库,【oracle数据库如何导入到pg库中】-其它论坛-ZOL中关村在线...
使用squirrel的db copy功能:选择多个表 copy paste, 可以跨多种数据库(基本上可以支持jdbc连接的数据库都可以,我只试下oracle postgresql),不错,就是它了, ...
- java监控表变化_关于实时监控oracle数据库表数据变化的设计与实现
近期接受项目需求,需要实时处理oracle数据库中表的数据变化,首先想到的是在程序中创建定时器,轮询表.鉴于程序冗余考虑,百度知:oracle数据库java存储过程.Oracle数据库有执行简单jav ...
- oracle数据库扩大表空间,[小技巧]手工扩大Oracle数据库表空间的方法
1.首先查看表空间的名字和所属文件select tablespace_name, file_id, file_name,round(bytes/(1024*1024),0) total_spacefr ...
最新文章
- LeetCode Python题解(二)----排序
- Aras学习笔记(1)学习Aras已半年有余,也积攒一些学习笔记,今天起会陆续分享出来,有兴趣的朋友一起交流...
- 十、分享一道LeetCode较为简单的单链表题,但是却能激发起练习算法的极大的兴趣
- Struts2+Spring2.5+Hibernate3.1实现登陆示例
- k8s组件批量启动、查看状态
- 基础设备----笔记
- 【快速安装Docker服务及Docker配置、Docker常用命令。】
- Selenium WebDriver之JavaScript
- 行内块 块级元素 行内元素
- amazeui PHP,amazeui页面分析之登录页面
- Android 自定义软键盘实现 数字九宫格
- Unity 时装换色
- .Net 面试题整理(一)
- 华师大网络学院计算机,华师大网络学院计算机原理作业.doc
- python练习(4)
- word2010 标尺游标的微调
- java 视频抽帧和gif 工具
- bmap、百度地图自定义画矩形
- (转)搜狗浏览器收藏夹文件恢复
- android暂停或停止其他音乐播放器的播放