暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

【每日一练 074】数据移动:SQL*Loader

原创 李美静 恩墨学院 2020-11-04
1773

1 SQL* Loader概览

SQL*Loader将数据从外部文件加载到Oracle数据库的表中。它有一个强大的数据解析引擎,对数据文件中的数据格式几乎没有限制。
image.png

2 SQL*Loader使用的文件

2.1 输入数据文件

SQLLoader从控制文件中指定的一个或多个文件(或操作系统文件等)中读取数据。从SQLLoader的角度来看,数据文件中的数据被组织为记录。特定的数据文件可以是固定记录格式、可变记录格式或流记录格式。记录格式可以在控制文件中用INFILE参数指定。如果没有指定记录格式,则默认为流记录格式。

2.2 控制文件

控制文件是一个文本文件,它是用SQLLoader能够理解的语言编写的。控制文件向SQLLoader指示在何处查找数据、如何解析和解释数据、在何处插入数据,等等。虽然不需要明确定义,但是控制文件可以有三个部分组成:
第一部分包括以下会议范围内的信息:
全局选项,例如要跳过的输入数据文件名和记录
INFILE子句,指定输入数据的位置
要加载的数据
第二部分由一个或多个表块组成。这些块中的每个块都包含关于要将数据加载到其中的表的信息(例如表名和表的列)。
第三部分是可选的,如果存在,则包含输入数据。
日志文件:当SQLLoader开始执行时,它会创建一个日志文件。如果无法创建日志文件,则执行终止。日志文件包含加载的详细摘要,包括加载期间发生的任何错误的描述。
坏文件:坏文件包含被SQL
Loader或Oracle数据库拒绝的记录。当输入格式无效时,SQLLoader会拒绝数据文件记录。在SQLLoader接受数据文件记录进行处理后,它将被发送到Oracle数据库,以便作为一行插入到表中。如果Oracle数据库确定该行是有效的,则将该行插入到表中。如果行被确定为无效,那么记录将被拒绝,SQL*Loader将其放入错误文件中。
丢弃文件:此文件仅在需要时创建,并且仅在指定应该启用丢弃文件时创建。丢弃文件包含从加载中筛选出来的记录,因为它们不匹配控制文件中指定的任何记录选择标准。

2.2.1 控制文件内容

SQLLoader控制文件是一个包含数据定义语言(DDL)指令的文本文件。DDL用于控制SQLLoader会话的以下方面:
SQLLoader在哪里找到要加载的数据
SQL
Loader期望数据如何被格式化
SQLLoader在加载数据时是如何配置的(包括内存管理、选择和拒绝标准、中断的加载处理,等等)
SQL
Loader如何操作被加载的数据

2.2.2 控制文件示例

---sameple 
 LOAD DATA
 INFILE ’SAMPLE.DAT’
 BADFILE ’sample.bad’
 DISCARDFILE ’sample.dsc’
 APPEND
 INTO TABLE emp
WHEN (57) = ’.’
TRAILING NULLCOLS
 (hiredate SYSDATE,
		 deptno POSITION(1:2) INTEGER EXTERNAL(3)
	    NULLIF deptno=BLANKS,
		 job POSITION(7:14) CHAR TERMINATED BY WHITESPACE
		 NULLIF job=BLANKS "UPPER(:job)",
		 mgr POSITION(28:31) INTEGER EXTERNAL
		 TERMINATED BY WHITESPACE, NULLIF mgr=BLANKS,
	    ename POSITION(34:41) CHAR
		 TERMINATED BY WHITESPACE "UPPER(:ename)",
		 empno POSITION(45) INTEGER EXTERNAL
		 TERMINATED BY WHITESPACE,
		 sal POSITION(51) CHAR TERMINATED BY WHITESPACE
		 "TO_NUMBER(:sal,’$99,999.99’)",
		 comm INTEGER EXTERNAL ENCLOSED BY ’(’ AND ’%’
		 ":comm * 100"
	 )

解释:

  1. 注释可以出现在文件的命令部分的任何地方,但是它们不能出现在数据中。在任何注释前加上两个连字符。双连字符右边的所有文本将被忽略,直到行尾为止。
  2. LOAD DATA语句向SQL*Loader指示这是一次新数据加载的开始。如果要继续加载已被中断的加载,请使用CONTINUE load DATA语句。
  3. INFILE关键字指定包含要加载的数据的数据文件的名称。
  4. 关键字BADFILE指定存放被拒绝记录的文件的名称。
  5. DISCARDFILE关键字指定存放丢弃记录的文件的名称。
  6. 在将数据加载到非空表时,APPEND关键字是可以使用的选项之一。若要将数据加载到空表中,请使用INSERT关键字。
  7. 使用INTO TABLE关键字可以识别表、字段和数据类型。它定义了数据文件中的记录与数据库中的表之间的关系。
  8. WHEN子句指定每个记录在SQL加载器加载数据之前必须匹配的一个或多个字段条件。在本例中,SQLLoader仅在第57个字符是小数点的情况下加载记录。该小数点在字段中分隔美元和美分,如果SAL没有值,则会导致拒绝记录。
  9. 后面的NULLCOLS子句提示SQL*加载程序将记录中不存在的任何相对定位的列视为空列。
  10. 控制文件的其余部分包含字段列表,该列表提供有关正在加载的表中的列格式的信息。

3 保存数据的方法

传统的路径加载执行SQL INSERT语句来填充Oracle数据库中的表。通过格式化Oracle数据块并将数据块直接写入数据库文件,直接路径加载消除了大部分Oracle数据库开销。直接加载不会与其他用户竞争数据库资源,因此它通常可以以接近磁盘速度加载数据。传统的路径加载使用SQL处理和数据库提交操作来保存数据,在插入记录数组之后执行提交操作。每次数据加载可能涉及多个事务。
直接路径加载使用数据保存将数据块写入Oracle数据文件。这就是为什么直接路径加载比传统加载要快。以下特性将数据保存与提交区分开来:
在数据保存期间,只有完整的数据库块被写入数据库。
这些块写在表的高水位标记(HWM)之后。
数据保存后,HWM将被移动。
数据保存后不会释放内部资源。
数据保存不会结束事务。
索引不会在每次数据保存时更新。

4 SQL*Loader Express模式

如果激活SQLLoader Express模式,只指定用户名和表参数,那么它将为其他几个参数使用默认设置。通过在命令行上指定附加参数,可以覆盖大多数默认值。
SQL
Loader Express模式生成两个文件。日志文件的名称来自表的名称(默认情况下)。
一个日志文件,包括:
控制文件输出
用于创建外部表和使用SQL INSERT AS SELECT语句执行加载的SQL脚本
SQLLoader Express模式既不使用控制文件,也不使用SQL脚本。如果想使用它们作为起点,使用常规SQLLoader 独立外部表执行操作,则可以使用它们。
一个类似于SQLLoader 日志文件的日志文件,描述操作的结果
“%p”表示SQL
Loader进程的进程ID。
sample:
下面是一个名为test.dat的输入数据文件示例,其中包含要加载的两条记录,以及加载完成后生成的两个日志文件的摘录。

The table HR.TEST was created with three columns, C1 NUMBER, C2 VARCHAR2(10), and C3 VARCHAR2(10).
$ more test.dat
3 C WWW
4 D UUU
$ sqlldr hr TABLE=test
$ more test.log
…
Express Mode Load, Table: TEST
Data File:      test.dat
 Bad File:     test_%p.bad    …
Table TEST, loaded from every logical record.
Insert option in effect for this table: APPEND
Column Name          Position   Len   Term Encl Datatype
-------------------- ---------- ----- ---- ---- ---------
C1                   FIRST               *    , CHARACTER            
C2                   NEXT                *    , CHARACTER            
C3                   NEXT                *    , CHARACTER            
Generated control file for possible reuse:
OPTIONS(EXTERNAL_TABLE=EXECUTE, TRIM=LRTRIM)
LOAD DATA INFILE 'test'  APPEND INTO TABLE TEST
FIELDS TERMINATED BY ","  (  C1,  C2,  C3)
End of generated control file for possible reuse.
…
creating external table "SYS_SQLLDR_X_EXT_TEST"
CREATE TABLE "SYS_SQLLDR_X_EXT_TEST" 
("C1" NUMBER,"C2" CHAR(1),"C3" VARCHAR2(20)) ORGANIZATION external(
TYPE oracle_loader DEFAULT DIRECTORY SYS_SQLLDR_XT_TMPDIR_00000
ACCESS PARAMETERS 
( RECORDS DELIMITED BY NEWLINE CHARACTERSET US7ASCII
  BADFILE 'SYS_SQLLDR_XT_TMPDIR_00000':'test_%p.bad'
  LOGFILE 'test_%p.log_xt'  READSIZE 1048576
  FIELDS TERMINATED BY "," LRTRIM REJECT ROWS WITH ALL NULL FIELDS ("C1" CHAR(255),"C2" CHAR(255),"C3" CHAR(255)))
 location ('test.dat')) REJECT LIMIT UNLIMITED
executing INSERT statement to load database table TEST
INSERT /*+ append parallel(auto) */ INTO TEST (C1, C2, C3) 
SELECT   "C1",  "C2",  "C3" FROM "SYS_SQLLDR_X_EXT_TEST"  …
Table TEST:   2 Rows successfully loaded.

最后修改时间:2020-11-23 09:57:43
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论