一、SQLloader概念
1、基本概念
SQLLoader是Oracle数据库提供的一个数据导入工具,它用于将外部数据(例如文本文件)加载到Oracle数据库表中。
SQLLoader提供了高效的数据加载机制,可以处理大量数据,并提供了一些高级功能来处理数据转换和数据校验。
2、下面是SQL*Loader的一般用法:
(1)创建控制文件(Control File):
控制文件是描述数据加载过程的文本文件,它指定了数据文件的位置、表结构的映射、数据转换规则、数据校验规则等。可以通过自定义创建控制文件或使用 SQL*Loader 控制文件生成器来生成。
(2)创建数据文件(Data File):
数据文件包含要加载到数据库表中的数据。数据文件可以是纯文本文件、CSV文件或其他格式文件。确保数据文件的格式与控制文件定义的格式相匹配。
(3)编写加载命令:
在命令行或脚本中编写SQL*Loader的加载命令。命令包括指定控制文件、数据文件、数据库连接信息等。
(4)执行加载命令:
执行SQLLoader的加载命令,开始将数据加载到数据库表中。SQLLoader会读取数据文件,并根据控制文件定义的规则进行数据转换和数据校验。
(5)处理加载错误:
SQL*Loader在加载过程中会生成日志文件,记录加载的情况和错误信息。您可以检查日志文件以查看加载过程中是否有错误,并进行相应的处理。
3、SQL*Loader提供了丰富的功能和选项来满足不同的数据加载需求,例如:
- 数据转换:可以在控制文件中定义数据列的转换规则,例如日期格式转换、字符串转换等。
- 数据校验:可以使用控制文件中的条件和约束来进行数据校验,例如是否为唯一值、是否在范围内等。
- 并行加载:可以通过指定并行加载选项来提高加载效率,利用多个进程同时加载数据。
- 字符集处理:支持不同字符集的数据加载,允许在控制文件中指定字符集转换规则。
总体而言,SQLLoader是一个强大而灵活的工具,可用于高效地将外部数据加载到Oracle数据库中。
二、SQLLoader语法
1、语法讲解
Usage: SQLLDR keyword=value [,keyword=value,...]
Valid Keywords:
userid -- ORACLE username/password --导入用户的用户名和密码 control -- control file name --控制文件的路径和文件名-最重要,里面包含了导入的表名,表结构,及各种模式 log -- log file name bad -- bad file name data -- data file name discard -- discard file name discardmax -- number of discards to allow (Default all) skip -- number of logical records to skip (Default 0) load -- number of logical records to load (Default all) errors -- number of errors to allow (Default 50) rows -- number of rows in conventional path bind array or between direct path data saves(Default: Conventional path 64, Direct path all) bindsize -- size of conventional path bind array in bytes (Default 256000) silent -- suppress messages during run (header,feedback,errors,discards,partitions) direct -- use direct path (Default FALSE) parfile -- parameter file: name of file that contains parameter specifications parallel -- do parallel load (Default FALSE) file -- file to allocate extents from skip_unusable_indexes -- disallow/allow unusable indexes or index partitions (Default FALSE) skip_index_maintenance -- do not maintain indexes, mark affected indexes as unusable (Default FALSE) commit_discontinued -- commit loaded rows when load is discontinued (Default FALSE) readsize -- size of read buffer (Default 1048576) external_table -- use external table for load; NOT_USED, GENERATE_ONLY, EXECUTE (Default NOT_USED) columnarrayrows -- number of rows for direct path column array (Default 5000) streamsize -- size of direct path stream buffer in bytes (Default 256000) multithreading -- use multithreading in direct path resumable -- enable or disable resumable for current session (Default FALSE) resumable_name -- text string to help identify resumable statement resumable_timeout -- wait time (in seconds) for RESUMABLE (Default 7200) date_cache -- size (in entries) of date conversion cache (Default 1000) no_index_errors -- abort load on any index errors (Default FALSE)
2、控制文件语法:
(1)控制文件的说明
控制文件是描述数据加载过程的文本文件,用于指定数据文件、表结构的映射、数据转换规则、数据校验规则等。
(2)以下是控制文件的基本语法:OPTIONS (可选的SQL*Loader选项)
LOAD DATA INFILE 'data_file' INTO TABLE table_name APPEND|INSERT|REPLACE (可选的加载方式) FIELDS TERMINATED BY ',' (字段分隔符) (COLUMN1, COLUMN2, ... )
(3)控制文件的参数解释
OPTIONS: 可选的 SQL*Loader 选项,用于指定加载的行为和属性,例如字符集、并行加载等。 INFILE: 指定数据文件的路径和文件名。 INTO TABLE: 指定要加载数据的数据库表名。 APPEND|INSERT|REPLACE: 可选的加载方式,指定将数据添加到表中、插入数据替代现有数据或替换整个表。 FIELDS TERMINATED BY ',': 字段分隔符,用于指定数据文件中的字段分隔符,逗号 (‘,’) 是最常见的分隔符,但也可以是其他字符。 (COLUMN1, COLUMN2, ... ): 指定要加载的目标表的列名,以明确指定目标表中的哪些列与数据文件中的哪些字段对应。
三、案例
1、开发提供20w的txt文件数据
(1)开发提供的原始数据文件
(2)数据处理后的数据文件
2、数据库中创建表
sqlplus test/123
create table KSSM ( xjbh VARCHAR2(50), mitemcode VARCHAR2(100), chang NUMBER, kuan NUMBER, zl NUMBER, rksj DATE, jtsl NUMBER, jtwz VARCHAR2(100), gw VARCHAR2(50), cw VARCHAR2(10), cx VARCHAR2(10), zb VARCHAR2(100), fqsj DATE, phsj DATE, fysj DATE, dx VARCHAR2(100) )
3、控制文件
LOAD DATA INFILE '20w.txt' APPEND INTO TABLE kssm FIELDS TERMINATED BY "," --以逗号隔开的各列 TRAILING NULLCOLS --针对最后一个列是null值 (xjbh, mitemcode, chang, kuan, zl, rksj date "yyyy-mm-dd hh24:mi:ss", --此处是日期格式 jtsl, jtwz, dx, gw, cw, cx, zb )
注意事项:不管txt里面是varchar2还是number类型,处理的数据,全部为无符号标记
4、导入数据
sqlldr test/123 control=sqlload.ctl
...
20w的数据处理时长大约10-20秒。