有的时候我们需要导入大量的数据,使用sqlldr把文本导入到表中是一件很高效率的事情,这是sqlldr命令,也就是SQL*LOADER的小案例一枚。
准备环境:oracle10.2 cmd控制台 scott方案的bonus表
操作目的: 使用文本中的数据,加载到bonus表中
操作前:
SQL> select *from bonus; ENAME JOB SAL COMM ---------- --------- ---------- ----------
查看sqlldr的说明:
SQL*Loader: Release 10.2.0.1.0 - Production on 星期一 11月 26 09:57:43 2012 Copyright (c) 1982, 2005, Oracle. All rights reserved. 用法: SQLLDR keyword=value [,keyword=value,...] 有效的关键字: userid -- ORACLE 用户名/口令 control -- 控制文件名 log -- 日志文件名 bad -- 错误文件名 data -- 数据文件名 discard -- 废弃文件名 discardmax -- 允许废弃的文件的数目 (全部默认) skip -- 要跳过的逻辑记录的数目 (默认 0) load -- 要加载的逻辑记录的数目 (全部默认) errors -- 允许的错误的数目 (默认 50) rows -- 常规路径绑定数组中或直接路径保存数据间的行数 (默认: 常规路径 64, 所有直接路径) bindsize -- 常规路径绑定数组的大小 (以字节计) (默认 256000) silent -- 运行过程中隐藏消息 (标题,反馈,错误,废弃,分区) direct -- 使用直接路径 (默认 FALSE) parfile -- 参数文件: 包含参数说明的文件的名称 parallel -- 执行并行加载 (默认 FALSE) file -- 要从以下对象中分配区的文件 skip_unusable_indexes -- 不允许/允许使用无用的索引或索引分区 (默认 FALSE) skip_index_maintenance -- 没有维护索引, 将受到影响的索引标记为无用 (默认 FALSE) commit_discontinued -- 提交加载中断时已加载的行 (默认 FALSE) readsize -- 读取缓冲区的大小 (默认 1048576) external_table -- 使用外部表进行加载; NOT_USED, GENERATE_ONLY, EXECUTE (默认 NOT_USED) columnarrayrows -- 直接路径列数组的行数 (默认 5000) streamsize -- 直接路径流缓冲区的大小 (以字节计) (默认 256000) multithreading -- 在直接路径中使用多线程 resumable -- 启用或禁用当前的可恢复会话 (默认 FALSE) resumable_name -- 有助于标识可恢复语句的文本字符串 resumable_timeout -- RESUMABLE 的等待时间 (以秒计) (默认 7200) date_cache -- 日期转换高速缓存的大小 (以条目计) (默认 1000)
① 使用前的准备,已经建立的表,控制文件(D盘下dump\test1.ctl)
内容如下:
LOAD DATA --开头部分是标准语法 INFILE * --这一句是引用data文件,这里是和控制文件放在一起,所以用* --中间的部分全部是控制部分,也可以分开写,control,log和data文件 INTO TABLE BONUS --表名 FIELDS TERMINATED BY "," --设置数据的分隔符,看看下面的数据是不是都是","分开的 (ENAME,JOB,SAL) --字段信息 BEGINDATA --下一行开始全部是数据 SMITH,CLEAK,3904 ALLEN,SALESMAN,2891 WARD,SALESMAN,3128 KING,PRESIDENT,2523
② 执行命令,得到结果
D:\dump>sqlldr scott/lzz123 control=test1.ctl SQL*Loader: Release 10.2.0.1.0 - Production on 星期一 11月 26 10:11:40 2012 Copyright (c) 1982, 2005, Oracle. All rights reserved. 达到提交点 - 逻辑记录计数 3 达到提交点 - 逻辑记录计数 4
③ 查看记录,看看是否加载成功。
SQL> select *from bonus; ENAME JOB SAL COMM ---------- --------- ---------- ---------- SMITH CLEAK 3904 ALLEN SALESMAN 2891 WARD SALESMAN 3128 KING PRESIDENT 2523
!!:圆满完成。
* 在dump目录下我们找到了test1.log文件,这是自动生成的,当然我们也可以指定名称
* 打开log文件看到如下内容:
SQL*Loader: Release 10.2.0.1.0 - Production on 星期一 11月 26 10:11:40 2012 Copyright (c) 1982, 2005, Oracle. All rights reserved. 控制文件: test1.ctl 数据文件: test1.ctl 错误文件: test1.bad 废弃文件: 未作指定 (可废弃所有记录) 要加载的数: ALL 要跳过的数: 0 允许的错误: 50 绑定数组: 64 行, 最大 256000 字节 继续: 未作指定 所用路径: 常规 表 BONUS,已加载从每个逻辑记录 插入选项对此表 INSERT 生效 列名 位置 长度 中止 包装数据类型 ------------------------------ ---------- ----- ---- ---- --------------------- ENAME FIRST * , CHARACTER JOB NEXT * , CHARACTER SAL NEXT * , CHARACTER 表 BONUS: 4 行 加载成功。 由于数据错误, 0 行 没有加载。 由于所有 WHEN 子句失败, 0 行 没有加载。 由于所有字段都为空的, 0 行 没有加载。 为绑定数组分配的空间: 49536 字节 (64 行) 读取 缓冲区字节数: 1048576 跳过的逻辑记录总数: 0 读取的逻辑记录总数: 4 拒绝的逻辑记录总数: 0 废弃的逻辑记录总数: 0 从 星期一 11月 26 10:11:40 2012 开始运行 在 星期一 11月 26 10:11:41 2012 处运行结束 经过时间为: 00: 00: 00.48 CPU 时间为: 00: 00: 00.06
详细记录了整个导入过程的参数,如果导入出错还会有错误文件。
当然像excel表,导入部分数据等等的功能也可以实现的,只是控制文件的参数不同。
参考资料:三思《涂抹oracle》;
本文出自 “orangleliu笔记本” 博客,请务必保留此出处http://blog.csdn.net/orangleliu