oracle sqlldr 用法详解

Oracle sqlldr( Sql Loader )的用法 简介:SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件(数据)迁移到ORACLE数据库中。SQL*LOADER是大型数据仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL)。目前的理解就是:把文本文件,log文件,excel导入到数据库中写sqlldr只需2步:1:建立一个ctl控制文件    2:在命令窗口执行,或者在shell脚本中写1:建... 阅读详情
AI摘要

本文详细介绍了Oracle SQL*Loader工具的使用方法,包括控制文件的配置、数据文件的准备及导入操作流程。此外还讲解了如何通过调整参数来优化SQL*Loader的性能,并提供了多个实用案例。

转自:http://blog.chinaunix.net/uid-23622436-id-2394093.html

在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法:

1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中
2. 建立数据库间的 dblink,然后用 create table B as select * from A@dblink where ...,或 insert into B select * from A@dblink where ...
3. exp A 表,再 imp 到 B 表,exp 时可加查询条件
4. 程序实现 select from A ..,然后 insert into B ...,也要分批提交
5. 再就是本篇要说到的 Sql Loader(sqlldr) 来导入数据,效果比起逐条 insert 来很明显

第 1 种方法在记录多时是个噩梦,需三五百条的分批提交,否则客户端会死掉,而且导入过程很慢。如果要不产生 REDO 来提高 insert into 的性能,就要下面那样做:
 

alter table B nologging;  
insert /* +APPEND */ into B(c1,c2) values(x,xx);  
insert /* +APPEND */ into B select * from A@dblink where .....;  


好 啦,前面简述了 Oracle 中数据导入导出的各种方法,我想一定还有更高明的。下面重点讲讲 Oracle  的 Sql Loader (sqlldr) 的用法。

在命令行下执行 Oracle  的 sqlldr 命令,可以看到它的详细参数说明,要着重关注以下几个参数:

userid -- Oracle 的 username/password[@servicename]
control -- 控制文件,可能包含表的数据
-------------------------------------------------------------------------------------------------------
log -- 记录导入时的日志文件,默认为 控制文件(去除扩展名).log
bad -- 坏数据文件,默认为 控制文件(去除扩展名).bad
data -- 数据文件,一般在控制文件中指定。用参数控制文件中不指定数据文件更适于自动操作
errors -- 允许的错误记录数,可以用他来控制一条记录都不能错
rows -- 多少条记录提交一次,默认为 64
skip -- 跳过的行数,比如导出的数据文件前面几行是表头或其他描述

还有更多的 sqlldr 的参数说明请参考:sql loader的用法。

用例子来演示 sqlldr 的使用,有两种使用方法:
1. 只使用一个控制文件,在这个控制文件中包含数据
2. 使用一个控制文件(作为模板) 和一个数据文件
一般为了利于模板和数据的 分离,以及程序的不同分工会使用第二种方式,所以先来看这种用法。数据文件可以是 CSV 文件或者以其他分割符分隔的,数据文件可以用 PL/SQL Developer 或者 Toad 导出,也可以用 SQL *Plus 的  spool 格式化产出,或是 UTL_FILE 包生成。另外,用 Toad 还能直接生成包含数据的控制文件。
首先,假定有这么一个表 users,并插入五条记录:

create table users(  
    user_id number,           --用户 ID  
    user_name varchar2(50),   --用户名  
    login_times number,       --登陆次数  
    last_login date           --最后登录日期  
)  

insert into users values(1,'Unmi',3,sysdate);  
insert into users values(2,NULL,5,to_date('2008-10-15','YYYY-MM-DD'));  
insert into users values(3,'隔叶黄莺 ',8,to_date('2009-01-02','YYYY-MM-DD'));  
insert into users values(4,'Kypfos',NULL,NULL);  
insert into users values(5,'不知秋 ',1,to_date('2008-12-23','YYYY-MM-DD'));  

第 二种方式: 使用一个控制文件(作为模板) 和一个数据文件

1) 建立数据文件,我们这里用 PL/SQL Developer 导出表 users 的记录为 users_data.csv 文件,内容如下:

  1. "   ","USER_ID","USER_NAME","LOGIN_TIMES","LAST_LOGIN"  
  2. "1","1","Unmi","3","2009-1-5 20:34:44"  
  3. "2","2","","5","2008-10-15"  
  4. "3","3","隔叶黄莺","8","2009-1-2"  
  5. "4","4","Kypfos","",""  
  6. "5","5","不知秋","1","2008-12-23"  

2) 建立一个控制文件 users.ctl,内容如下:

OPTIONS (skip=1,rows=128) -- sqlldr 命令显示的 选项可以写到这里边来,skip=1 用来跳过数据中的第一行  
LOAD DATA  
INFILE "users_data.csv" --指定外部数据文件,可以写多 个 INFILE "another_data_file.csv" 指定多个数据文件  
--这里还可以使 用 BADFILE、DISCARDFILE 来指定坏数据和丢弃数据的文件,  
truncate --操作类型,用 truncate table 来清除表中原有 记录  
INTO TABLE users -- 要插入记录的表  
Fields terminated by "," -- 数据中每行记录用 "," 分隔  
Optionally enclosed by '"' -- 数据中每个字段用 '"' 框起,比如字段中有 "," 分隔符时  
trailing nullcols --表的字段没有对应的值时允 许为空  
(  
  virtual_column FILLER, --这是一个虚拟字段,用来跳 过由 PL/SQL Developer 生成的第一列序号  
  user_id number, --字段可以指定类型,否则认 为是 CHARACTER 类型, log 文件中有显示  
  user_name,  
  login_times,  
  last_login DATE "YYYY-MM-DD HH24:MI:SS" -- 指定接受日期的格式,相当用 to_date() 函数转换  
)  

说 明:在操作类型 truncate 位置可用以下中的一值:

1) insert     --为缺省方式,在数据装载开始时要求表为空
2) append  --在表中追加新记录
3) replace  --删除旧记录(用 delete from table 语句),替换成新装载的记录
4) truncate --删除旧记录(用 truncate table 语句),替换成新装载的记录

3) 执行命令:

sqlldr dbuser/dbpass@dbservice control=users.ctl

在 dbservice 指示的数据库的表 users 中记录就和数据文件中的一样了。

执行完 sqlldr 后希望能留意一下生成的几个文件,如 users.log 日志文件、users.bad 坏数据文件等。特别是要看看日志文件,从中可让你更好的理解 Sql Loader,里面有对控制文件的解析、列出每个字段的类型、加载记录的统计、出错原因等信息。

第一种方式,只使用一个控制文件 在这个控制文件中包含数据

1) 把 users_data.cvs 中的内容补到 users.ctl 中,并以 BEGINDATA 连接,还要把 INFILE "users_data.csv" 改为 INFILE *。同时为了更大化的说明问题,把数据处理了一下。此时,完整的 users.ctl 文件内容是:

OPTIONS (skip=1,rows=128) -- sqlldr 命令显示的 选项可以写到这里边来,skip=1 用来跳过数据中的第一行  
LOAD DATA  
INFILE *  -- 因为数据同控制文件在一 起,所以用 * 表示  
append    -- 这里用 了 append 来操作,在表 users 中附加记录   
INTO TABLE users  
when LOGIN_TIMES<>'8'  -- 还可以用 when 子 句选择导入符合条件的记录  
Fields terminated by ","  
trailing nullcols  
(  
  virtual_column FILLER, --跳过 由 PL/SQL Developer 生成的第一列序号  
  user_id "user_seq.nextval", --这一列直接取序列的下一值,而不用数据中提供的值  
  user_name "'Hi '||upper(:user_name)",--,还能用SQL函数或运算对数据进行加工处理  
  login_times terminated by ",", NULLIF(login_times='NULL') --可为列单独指定分隔符  
  last_login DATE "YYYY-MM-DD HH24:MI:SS" NULLIF (last_login="NULL") -- 当字段为"NULL"时就是 NULL  
)  
BEGINDATA --数据从这里开始  
   ,USER_ID,USER_NAME,LOGIN_TIMES,LAST_LOGIN  
1,1,Unmi,3,2009-1-5 20:34  
2,2,Fantasia,5,2008-10-15  
3,3,隔叶黄 莺,8,2009-1-2  
4,4,Kypfos,NULL,NULL  
5,5,不知 秋,1,2008-12-23  

2) 执行一样的命令:

sqlldr dbuser/dbpass@dbservice control=users.ctl

比 如,在控制台会显示这样的信息:

C:\>sqlldr dbuser/dbpass@dbservice control=users.ctl

SQL*Loader: Release 9.2.0.1.0 - Production on 星期三 1月 7 22:26:25 2009

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

达到提交点,逻辑记录计数4
达到提交点,逻辑记录计数5

上面的控制文 件包含的内容比较复杂(演示目的),请根据注释理解每个参数的意义。还能由此发掘更多用法。

最后说下有关 SQL *Loader 的性能与并发操作

1) ROWS 的默认值为 64,你可以根据实际指定更合适的 ROWS 参数来指定每次提交记录数。(体验过在 PL/SQL Developer 中一次执行几条条以上的 insert 语句的情形吗?)

2)常规导入可以通过使用 INSERT语句来导入数据。Direct导入可以跳过数据库的相关逻辑(DIRECT=TRUE),而直接将数据导入到数据文件中,可以提高导入数据的 性能。当然,在很多情况下,不能使用此参数(如果主键重复的话会使索引的状态变成UNUSABLE!)。

3) 通过指定 UNRECOVERABLE选项,可以关闭数据库的日志(是否要 alter table table1 nologging 呢?)。这个选项只能和 direct 一起使用。

4) 对于超大数据文件的导入就要用并发操作了,即同时运行多个导入任务.

  sqlldr   userid=/   control=result1.ctl   direct=true   parallel=true   
  sqlldr   userid=/   control=result2.ctl   direct=true   parallel=true   
  sqlldr   userid=/   control=result2.ctl   direct=true   parallel=true  

  当加载大量数据时(大约超过10GB),最好抑制日志的产生:   
  SQL>ALTER   TABLE   RESULTXT   nologging; 
  这样不产生REDO LOG,可以提高效率。然后在 CONTROL 文件中 load data 上面加一行:unrecoverable,  此选项必须要与DIRECT共同应用。   
  在并发操作时,ORACLE声称可以达到每小时处理100GB数据的能力!其实,估计能到 1-10G 就算不错了,开始可用结构 相同的文件,但只有少量数据,成功后开始加载大量数据,这样可以避免时间的浪费。

(注意:一般只能用ASCII码形式,切记要转换编码,不然导入数据为空)

参考:1. Oracle SQL*Loader  -- 英文,Sql Loader 的官方使用说明,包含多种类型的  Demo
        2. sql loader的用法  -- 列出了 sql loader 的选择参数的中文说明
        3. 使用SQL Loader导入大量数据,避免使用SQL频繁写库 -- 一个简单的例子,快带了解 Sql Loader 的用法
        4. Oracle SQL Loader的详细语法
        5. oracle sql loader全攻略 -- 还算名符其实。并讲了如何用 SQL *Plus 的  spool 或 UTL_FILE 包生成数据文件
        6. SQL*Loader Control File Reference   -- 英文,控制文件使用参考
        7. 学习oracle sql loader 的使用 
        8. 用 sqlloader(sqlldr)装载LOB数据  -- LOB 的内类是一个外部文件,用 sql loader 导入到数据库
        9. SQLLDR直 接加载几个参数的测试
        10.Maximizing SQL*Loader Performance

sqlldr----数据加载工具 sqlldr即SQL*Loader,SQL*Loader是Oracle的高速批量的数据加载工具,通常用来将操作系统文件(数据)迁移到Oracle数据库中,是大型数据仓库选择使用的加载方法。其可用于多种平面文件格式向Oralce数据库中加载数据,sqlldr可以在极短的时间内加载数量庞大的数据,其有两种操作模式:1)传统路径(conventional path):sqlldr会利用SQL插入为我们加载数据。 阅读详情

相关推荐

Oracle - 在sqlldr下使用控制文件加载数据

SQLLDR:Sql*Loader 一:sqlldr的位置 sqlldr.exe和sqlplus.exe在一个目录中,鉴于不同版本数据库具体位置可能有不同,可直接搜索文件名获得路径。 可直接将该路径配置为环境变量,后期可直接使用sqlplus和sqlldr 二:将要导入的数据直接放进 .ctl 控制文件中(DATA表必须存在!) 1> 控制文件格式 LOAD ...

⚡ 2029

SQLLDR 简介

1. SQLLDR导入   1.1 简介  SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件(数据)迁移到ORACLE数据库中。SQL*LOADER是大型数据仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL)。   2.2 语法和参数 语法: SQLLDR keyword=value [,keyword=value,..

longtimetoc的博客 4105

Oracle使用sqlload加载数据到库表(附带脚本)

Oracle之sqlload加载数据到指定的库表

奋斗的阿杰的博客 1729

Oracle-工具之SQLLDR

Oracle工具之SQLLDR

UntifA的博客 6863

104报文解析工具

可选择包含报文的文本文件或日志文件进行解析,可选择按条数范围或时间范围,输出结果可以在报文解析显示区,也可以输出到文件。可以对文本内容的报文文件进行高级分析,包括遥信遥测等通讯数据的具体信息,通讯帧的统计,通讯次数的统计,各种错误的分析,报文的定位功能,传输的文件具体内容等。输入完成后点击工具栏的解析报文按钮或使用右键菜单的解析就可以对报文进行解析。在报文输入区输入待解析报文并解析后,解析结果就显示在报文解析显示区和报文定位展示区及报文定位条目区。当有多条报文解析后,可以通过报文列表树具体定位某条报文。

XZHOUMIN的博客 5947

SQLLDR简介 和 Oracle插入大量数据

SQLLOADER是ORACLE的数据加载工具,通常用来将操作系统文件(数据)迁移到ORACLE数据库中。SQLLOADER是大型数据仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL)。

dwoiauda的博客 4058

Avellaneda & Stoikov’s market-making strategy 工程化处理

前2篇文章详细介绍了AS存货模型的做市策略,这次对于这些公式里面一些希腊字母的取值是如何计算的,如何做工程化并应用到生产环境中做一些说明。这个里面有一些重要参数:很直观,可以直接取值的有:s = current market mid price (中间价,也就是【最佳卖价+最佳买价】/2)q = quantity of assets in inventory of base asset (也就是买入多少价值的股票数量)

weixin_42480337的博客 7067

sqlldr mysql_Oracle中的SQLLDR工具使用

这个工具可以批量导入数据,具体使用方法如下:用法: SQLLDR keyword=value [,keyword=value,...] 有效的关键字: userid --这个工具可以批量导入数据,,具体使用方法如下:用法: SQLLDR keyword=value [,keyword=value,...]有效的关键字:userid -- Oracle 用户名/口令control -- 控制文件名l...

weixin_39807352的博客 335

PPT制作能力在职场中真的重要吗?一定要美术功底才能学好PPT吗?

我推出PPT技能培训专栏啦!好的PPT可以让你事半功倍、2023拥有PPT能力还可以让你具备一门极有价值的斜杠能力。更多内容请进:梦幻训练营专栏。专栏内会用本人积累的近10年的PPT学习方法论在短时间内教会你如何制作出精美绝伦的PPT,每篇教程后还会免费赠送一些小福利,不可多得。

打造全国最全的AI Agent开发知识领域的博客 728

博图SCL基础知识-寻址调用及新建SCL

和LAD/FBD不同,LAD/FBD在程序编辑器是一段一段的,编辑器可以插入新的网络段,每一个网络段可以有各自的注释。一般情况下,FB的简单数据类型形参可以没有对应实参,复杂数据类型的输入、输出也可以没有对应实参,所以FB可以隐藏或不隐藏不出现的形参。一般情况下,FB的简单数据类型形参可以没有对应实参,复杂数据类型的输入、输出也可以没有对应实参,所以FB可以隐藏或不隐藏不出现的形参。如图3所示,当FB的参数全部显示,在背景数据块右键可以激活"仅显示分配的参数";如图2所示,显示了一些FB调用的例子。

电工 2029

python调用sqlldr_oracle中的SQLLDR工具使用

这个工具可以批量导入数据,具体使用方法如下:用法: SQLLDR keyword=value [,keyword=value,...]有效的关键字:userid -- ORACLE 用户名/口令control -- 控制文件名log -- 日志文件名bad -- 错误文件名data -- 数据文件名discard -- 废弃文件名discardmax -- 允许废弃的文件的数目 (...

weixin_32243793的博客 577

STM32 驱动直流无刷电机(BLDC)发声

STM32 驱动直流无刷电机(BLDC)发声

perseverance51博客 3399

不安装oracle 获取sqlldr

oracle-xe-client-10.2.0.1-1.0.i386.rpm默认是没有SQLLDR组件的,如何让其支持sqlldr组件,以下是自己的一些尝试: 1.下载Oracle 客户端 oracle-xe-client-10.2.0.1-1.0.i386.rpm2.安装客户端   安装 rpm -i oracle-xe-client-10.2.0.1-1.0.i386.rpm  卸载 rpm -e oracle-xe-client-10.2.0.1-1.0.i3863.设置环境变量   ./usr

Mike的专栏 3559

手眼标定----眼在手上(eye-in-hand)

@TOC 标定之前你可以先拿个怡宝盖子进行测试。 第一步:打开halcon,采集,然后生成代码,显示十字架 第二步:把怡宝盖子放在十字架中心位置,在图像处理,找到怡宝盖子 第三步:找到怡宝盖子然后进行九点标定(眼在外帖子有讲),移动机器手然后分别拍9次照片,记录怡宝盖子坐标和当前机器坐标。这里移动到中心位置的时候记录一下单独记录一下坐标,等下要用。 顺序 第四步:拍完后利用vector_to_hom_mat2d算子求出矩阵,然后在利用write_tuple (HomMat2D, ‘路径’)进行保存。这里

苏州程序大白的博客 4279

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Oracle sqlldr的用法

一、概述 在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法: 1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中 2. 建立数据库间的 dblink,然后用 create tableB as select * fromA@dblinkwhere ...,或 insert intoB select * from...

记录日常开发过程中遇到的一些问题 761

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

oracle external table excel,Oracle 外部表(External Table)的用法与SQLLDR

对于外部表(External Table),数据库中只保存了表结构信息,而数据存放在文件系统上的外部文件中,所以外部表只能被只读访问。下面通过一个实例来介绍一下外部表的用法。要使用外部表首先要创建目录(在Oracle 9i之前目录需要通过utl_file_dir静态参数来设置)并授权,目录是数据文件的存放地点,数据文件是指外部表要读取的文件,通常是文本文件。SQL> connect / as...

weixin_36106506的博客 620

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Oracle外部表与SQLLDR

两种方法建立外部表 在建表语句中把EXTERNAL_TABLE参数设定为SQLLDR; 从12C起,可以使用模式来运行SQLLDR; 在建表语句中把EXTERNAL_TABLE参数设定为SQLLDR: 创建表dept,如下: create table dept as select * from scott.dept where 1 = 2; 建立...

weixin_30439067的博客 277

oracle数据泵及sqlldr

ORALCE 数据泵导入导出数据: 导出: 1、从cmd中以dba权限登录数据库:sqlplus system/密码@orcl as sysdba; 2、创建目录:create directory testoutput as 'e:\test'; 3、授权:grant read,write on DIRECTORY testoutput to SYS; 4、对应第二步所创建的目录,在数据库服务端的e盘新建文件夹test; 5、退出数据库登录:quit; 6、导出: Expdp...

阳阳 861

SHELL+SQLLDR读取文件更新数据至ORACLE

SHELL+SQLLDR读取文件更新数据至ORACLESQLLDR实现目标数据源文件test.txtsqlldr的test.ctl文件解释:shell代码:输入两个参数日期、表名--->执行:从指定路径读取数据源文件,读取数据库的表结构(可空和不可空等),创建该表对应的ctl文件,执行sqlldr脚本,完成数据插入-->返回数据是否全部成功插入 SQLLDR 实现目标 1.拿到一个te...

yisuoyanyulou1314的博客 3155

oracle sqlldr导入导出

目录 导入实例 常见问题解决办法 1 导出大字段 2 换号符处理 3 数据文件的字段超出最大长度 4 ORA-12899: 列的值太大 5 遇到特殊字符&处理 参考网址 sqlldr 数据类型 sqlldr 配置参数 qlplus 中执行sql 遇到特殊字符&处理 oracle 导出 字符超长处理 导入实例 打开命令提示符,执行命令 sqlplus username/password@127.0.0.1:1521/orcl --执行sql脚本 @E:\2019

谨 2031

sqlldr--将OS中非oracle数据导入oracle(一)

将/home/oracle/ext/shop1.data导入到scott.shop1表中   [oracle@localhost ext]$ cat /home/oracle/ext/shop1.data 1,apple,10 2,banana,20 3,book,25 4,pen,5   在os下,直接执行sqlldr可以查看帮助信息 [oracle@localhost e

lylnina0421的专栏 410

oracle中sqlldr和sqlplus使用

oracle中sqlldr和sqlplus使用 文章目录oracle中sqlldr和sqlplus使用一、简介二、sqlldr2.1 sqlldr使用2.1.1 sqlldr命令2.1.2 控制文件2.2 sqlldr示例2.2.1 数据在控制文件中2.2.2 数据在控制文件内指定的数据文件中2.2.3 数据在控制文件内指定的多个数据文件中2.2.4 数据在sqlldr命令参数指定的数据文件中2.2.5 控制文件调整指定字段2.2.6 控制文件跳过指定列2.2.7 添加自增字段和日期字段2.2.8 并行加载

panda-star的博客 1995

oracle sqlldr的用法

<br />原文地址:http://cid-0d10b655ce0a4311.spaces.live.com/blog/cns!D10B655CE0A4311!287.entry<br /> <br />1月28日文本如何导入oracle(sqlldr 的用法)<br /><br />关键词: 文本 导入 oracle <br />在命令提示符中输入sqlldr userid=system/manager control='c:/control.ctl',control.clt中的内容是: <br />lo

1139

Oracle之sqlldr sqluldr用法

1.sqlldr的用法 在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法: A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中 建立数据库间的 dblink,然后用 create table B as select from A@dblink where ...,或 insert...

weixin_34417183的博客 1108
上一篇: JSON.stringify() 详解
下一篇: js 判断浏览器类型与版本
shadow_zed
博客等级 码龄10年 6289粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值