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

oracle 实用的SQL-Loader数据装载技术

原创 不吃草的牛_Nick 2023-07-01
459

1.在装载中使用WHEN子句
可在数据装载中使用WHEN子句来限制只装载与某些条件匹配的那些行。例如,在一个数据文件中,可选取含有与某个标准相符的字段的那些记录。下例说明如何在SQL*Loader控制文件中使用WHEN子句:
LOAD DATA
INFILE *
INTO TABLE stagetbl
APPEND
WHEN (activity_type <>'H') and (activity_type <>'T')
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
/* Table columns here ...*/
BEGINDATA
/* Data here ...*/

WHEN条件将拒绝所有含有符合表stagetbl中activity_type列但既不是H也不是T的数据记录字段的记录.

2.将用户名装入表中
在装载中,可使用伪变量user将用户名装入一个表。下面的例子说明如何使用这个变量。请注意,目标表stagetbl应该具有一个名为loaded_by的列,以便SQL*Loader能插入用户名到该列中。
LOAD DATA
INFILE *
INTO TABLE stagetbl
INSERT
(loaded_by "USER")
/* Table columns and the data follow ... */

3.将大数据字段装载到襄中
如果试图将大于255字节的字段装载到表中,即使相应的表列定义为VARCHAR2(2000)或CLOB,SQL*Loader也不能装载该数据。系统将给出一个错误通知"Filed in data file exceeds maximum length.(数据文件中字段超过最大长度。)"为处理大字段的装载,在匹配表列与数据文件字段时,需要在控制文件中给出表列的大小,如下所示(对于名为text的表列):
LOAD DATA
INFILE '/path/testload.txt'
INSERT INTO TABLE testl23
FIELDS TERMINATED BY ','
(textCHAR(2000))

4.将序列号装载到表中
假如有一个名为test_seq的序列,并希望每当一个数据记录装载到表中时此序列增1,可如下进行:
LOAD DATA
INFILE '/path/testload.txt'
INSERT INTO TABLE testl23
(test_seq.nextval,...)

5.从表将数据装载到ASCII文件
有时,我们想取出数据库表中的数据,将其装入一个扁平文件中,以便在今后将这些数据装入其他位置上的Oracle表中。如果有大験的表,可以编写复杂的脚本来完成此工作,但如果只有少量的表要装载,则可使用下面用SQL*Plus命令提取数据的简单方法:
SET TERMOUT OFF
SET PAGESIZE 0
SET ECHO OFF
SET FEED OFF
SET HEAD OFF
SET LINESIZE 100
COLUMN customer_id FORMAT 999,999
COLUMN first_name FORMAT a15
COLUMN last_namc FORMAT a2S
SPOOL test.txt
SELECT customer_id,first_name,last_name FROM customer;
SPOOL OFF

也可以使用UTL_FILE程序包把数据装入文本文件。

6.在装载批量数据前删除索引
在使用NOLOGGING选项进行直接装栽之前应该考虑删除大表上的索引,这样做有两个主要理由。首先,对包括索引的表数据进行装载要花更长的时间。其次,如果保留索引,装载中对索引结构所做的更改将会生成重做记录。

提示 即使选择用NOLOGGING选项装载数据,也会生成相当多的用来标记对索引所做更改的重做信息.此外,还有一些支持数据字典的重做信息,即使是在NOLOGGING数据装载操作中也是如此.这里,最好的策略是删除索引并在创建表之后重建它们.

在执行直接装载时,实例可能会中途失败,SQL*Loader可能会占用更新索引所需的空间,或者SQL*Loader可能会遇到重复的索引键值。这种情形称为不可用索引(indexes left unusable)情形,因为索引在实例恢复时是不可用的。在这样的情况下,最好是在装载完成后再创建这些索引。

7.将数据装入多个表
可在同一个SQL*Loader运行中将数据装入多个表。下面挙例说明如何同时把数据装入两个表:
LOAD DATA
INFILE *
INSERT
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
)
上面的例子中,来自同一个数据文件的数据根据recid字段的值是否为1,被同时装入两个表dept 和emp中。

8.从SQL*Loader中捕捉错误代码
下面是一个如何捕捉SQL*Loader发出的进程错误代码的例子:


sqlldr PARFILE=test.par
retcode=$?
if [[retcode !=2 ]]
then
 mv ${ImpDir}/${Fil} ${InvalidLoadDir}/.${Dstamp}.${Fil}
 writeLog $func "Load Error" "load error:${retcode} on file"
else
 sqlplus / __EOF
 /* You can place any SQL statements to process the successfully loaded data */
__EOF

9.将XML数据装载到OracleXML数据库
SQL*Loader支持XML的列数据类型。如果列类型合适,则可以使用SQL*Loader将XML数据装入表中。SQL*Loader将XML列作为CLOB对待。Oracle还允许从原始数据文件或外部LOB文件装载XML数据。可使用固定长度的字段或分隔字段。也可以将整个文件的内容读入单个LOB字段。


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

评论