有的时候我们需要导入大量的数据,使用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》;