[Oracle] SQL*Loader 详细使用教程(4)- 字段列表

在上一篇中我们介绍了SQL*Loader中最重要的文件——控制文件,而本篇要介绍控制文件中最重要的部分——字段列表,字段列表的作用是把数据文件中的记录和数据库中表的列对应起来,下面是字段列表的一个例子,本篇我们将一一讲解它们的意思。

.
.
.
1  (hiredate  SYSDATE,
2     deptno  POSITION(1:2)  INTEGER EXTERNAL(2)
              NULLIF deptno=BLANKS,
3       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‘)",
4      comm   INTEGER EXTERNAL  ENCLOSED BY ‘(‘ AND ‘%‘
              ":comm * 100"
    )

指定列和字段的对应关系

我们知道SQL*Loader的工作就是把数据文件里的记录加载到数据库表中,因此一定要有数据文件的记录字段和数据库表的列的对应关系,因此在控制文件的字段列表里,我们首先得配置这种关系。这里要注意的是,并不需要表的所有列都出现在字段列表中,没有出现的列,SQL*Loader会自动用NULL填充。

但有一种字段比较特殊,叫解析字段(以FILTER标识),它不跟表的列匹配,它的主要作用是给WHEN语句提供条件判断的依据,如下所示:

INTO TABLE dept
   WHEN recid = 1
   (recid  FILLER POSITION(1:1)  INTEGER EXTERNAL,
    deptno POSITION(3:4)  INTEGER EXTERNAL,
    dname  POSITION(8:21) CHAR)
INTO TABLE emp
   WHEN recid <> 1
   (recid  FILLER POSITION(1:1)   INTEGER EXTERNAL,
    empno  POSITION(3:6)   INTEGER EXTERNAL,
    ename  POSITION(8:17)  CHAR,
    deptno POSITION(19:20) INTEGER EXTERNAL) 

指定位置(POSITION)

我们知道记录在数据文件中是以字节存储的,如果记录的每个字段大小是已知的,那么我们可以使用POSITION字句指定字段在记录中的字节位置,其语法如下:

下面是一些例子:

ename  POSITION (1:20)  CHAR
empno  POSITION (22-26) INTEGER EXTERNAL
allow  POSITION (*+2)   INTEGER EXTERNAL TERMINATED BY "/"

上例中,1~20字节对应ename列,22~26字节对应empno列,*表示从上一个字段的后一个字节开始(即27),所以*+2=29,也就是说从第29个字节开始,直到遇到分隔符‘/‘为止的所有字节,都属于allow列。

数据类型

SQL*Loader根据控制文件里定义的数据类型读取数据文件的字段,然后把它发给数据库表里对应的列,这里需要注意的是:控制文件定义的数据类型并不需要和数据库里对应的表列一样,因为SQL*Loader会自动转换,包括字符集的转换,当然,你必须得保证它们之间是可以转换的,否则会报错。

控制文件的数据类型分为两种,分别是可移植的和不可移植的,所谓可移植的数据类型就是和具体平台无关,而不可移植的正好相反。

不可移植的数据类型有:integer(n), smallint, float, double, byteint, zoned,decimal,vargraphic, varchar, varraw, long varraw,

通常情况下,我都采用可移植的数据类型,所以下面我们重点介绍可移植的数据类型:

CHAR

最常用也是默认的数据类型,其语法如下:

length表示CHAR的最大长度,如果不指定则为256,这里一定要跟数据库的CHAR区分开,SQL*Loader的CHAR是个变长的数据类型,有点类似于数据库的varchar。

Datatime

  • DATE
  • TIME
  • TIME WITH TIME ZONE
  • TIMESTAMP
  • TIMESTAMP WITH TIME ZONE
  • TIMESTAMP WITH LOCAL TIME ZONE

Interval

  • INTERVAL YEAR TO MONTH
  • INTERVAL DAY TO SECOND

Numeric EXTERNAL

以字符形式表示数值型的数据类型,包括(INTEGER EXTERNAL, FLOAT EXTERNAL, DECIMAL EXTERNAL, and ZONED EXTERNAL),他的特性和CHAR很像,在实际使用中,一般都采用它来代替不可移植的数值型数据类型。

分隔符

CHAR, datetime, interval, numeric EXTERNAL字段可以使用分隔符来标识,分隔符的语法如下:

Terminated by 和 Enclosed by 可以单独使用,也可以配合使用,以下是一些例子:

TERMINATED BY ‘,‘                      a data string,
ENCLOSED BY ‘"‘                        "a data string"
TERMINATED BY ‘,‘ ENCLOSED BY ‘"‘      "a data string",
ENCLOSED BY ‘(‘ AND ‘)‘                (a data string) 

字段条件设置(WHEN, NULLIF, DEFAULTIF)

NULLIF:如果符合条件则设为NULL,下面是一个例子:

ull_fieldname ... NULLIF column_name=BLANKS 

BLANKS参数表示空白的意思(不包括tab),上面的例子表示如果字段为BLANKS,则字段为NULL。

SQL*Loader生成数据

有时候我们可能希望有些数据在加载数据的过程中自动生成,SQL*Loader提供了一些参数用于生成数据。

CONSTANT

设置列的值为常量,语法如下:

column_name CONSTANT  value

表达式

设置列的值为表达式的值,语法如下:

column_name EXPRESSION "SQL string"

当前日期

设置列的值为当前日期,语法如下:

column_name SYSDATE

序列

设置列的值为唯一序列数字,语法如下:

例子:

[plain] view plain copy

print?

  1. id SEQUENCE(1,1)

这里要注意的是:无法使用Oracle数据库里的sequence,这点真的很不方便。

时间: 2024-12-31 20:53:47

[Oracle] SQL*Loader 详细使用教程(4)- 字段列表的相关文章

[Oracle] SQL*Loader 详细使用教程(2)- 命令行参数

sqlldr工具 SQL*Loader的客户端工具是sqlldr,在操作系统的命令行下输入sqlldr,后面不接任何参数,将显示帮助信息如下所示(所有命令行参数的简单描述及其默认值),所以你并不需要对下面的参数死记硬背,当你忘记它们时,可以通过这个方式快速查询. [plain] view plain copy print? Valid Keywords: userid -- ORACLE username/password control -- control file name log -- 

[Oracle] SQL*Loader 详细使用教程(3)- 控制文件

控制文件是SQL*Loader里最重要的文件,它是一个文本文件,用来定义数据文件的位置.数据的格式.以及配置数据加载过程的行为,在sqlldr中以control参数指定控制文件.   在控制文件里配置命令行参数 (OPTIONS) 在上一篇中我们讲过命令行参数可以配置在三个地方,其中一个就是可以使用控制文件的OPTIONS字句(这也是最常用的方式),如下所示: OPTIONS (DIRECT=true, SILENT=(ERRORS, FEEDBACK) ) 更多的命令行参数,请见上一篇.  

[Oracle] SQL*Loader 详细使用教程(1)- 总览

SQL*Loader原理 SQL*Loader是Oracle提供的用于数据加载的一种工具,它比较适合业务分析类型数据库(数据仓库),能处理多种格式的平面文件,批量数据装载比传统的数据插入效率更高.其示意图如下: 控制文件(Control File) (.ctl):用于控制数据导入的行为方式的文件(最重要的文件) 参数文件(可选)(Parameter File) (.par):可以把参数直接写在控制文件里,也可以单独写一个参数文件 数据文件(Data Files) :放置源数据的平面文件(可以一次

Oracle Sql Loader的学习使用

最近由于遇到oracle控制文件的使用,虽然不是很复杂,但是从来没有用过,专门花点时间看看.点击 这里 查看详细 1,概述: Sql Loader: 一个批量工具,将文件数据导入到数据库.可以导入一个表或者多个表,甚至可以在导入时修改数据. 2,使用 a,你电脑需要装Oracle,不然你是找不到Sqlldr 这个命令的. 在控制输入台输入 sqlldr: 会列出相关的参数介绍. > sqlldr . . . Usage: SQLLDR keyword=value [,keyword=value,

oracle之数据同步:Oracle Sql Loader使用说明(大批量快速插入数据库记录)

1.准备表数据 select * from emp10; create sequence seq_eseq increment by 1 start with 1001 maxvalue 999999999; --得到序列的SQL语句 select seq_eseq.nextval from sys.dual; --删除序列的SQL DROP SEQUENCE seq_eseq: create table emp10( empno number(4) primary key, ename var

oracle sql 截取表中某一字段的部分作为该字段查询结果

select distinct substr(t.stats_memo, instr(t.stats_memo, ':') + 1) as memo from b2c_coupon_exchange t where t.stats_audit = '3'

SQL*Loader数据装载工具入门_超越OCP精通Oracle视频课程培训24

oracle视频教程目标     Oracle视频教程,风哥本套oracle教程培训学习Oracle SQL*Loader概念及用法及SQL*Loader两个案例,同时课件带有近20个案例用于大家自行练习.适用人群IT相关从业人员.Oracle数据库技术人员.想加工资的.想升职的都可以. 视频在线学习地址:http://edu.51cto.com/course/course_id-6987.html Oracle视频教程简介本课程介绍:Oracle视频教程,风哥本套oracle教程培训学习Ora

IT忍者神龟之Oracle 的数据导入导出及 Sql Loader (sqlldr) 的用法

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

SQL*Loader 详解

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