数据加载与卸载:使用SQLLDR的全面指南
立即解锁
发布时间: 2025-08-23 01:58:38 阅读量: 8 订阅数: 32 


Oracle数据库架构与优化指南
# 数据加载与卸载:使用 SQLLDR 的全面指南
## 1. 日志文件的重要性
日志文件能提供数据加载过程的多方面信息,包括使用的选项、读取和加载的记录数量、BAD 和 DISCARD 文件的位置以及加载耗时等。它对于验证加载是否成功以及诊断错误至关重要。如果加载的数据引发 SQL 错误,这些错误会记录在日志文件中。日志文件的信息大多一目了然,无需过多解释。
## 2. SQLLDR 加载数据常见问题解答
### 2.1 日志文件中出现 “exceeds maximum length” 错误的原因
在使用 SQLLDR 时,常遇到日志文件包含类似如下错误信息的情况:
```plaintext
Record 4: Rejected - Error on table DEPT, column DNAME.
Field in data file exceeds maximum length
```
这是因为 SQLLDR 处理输入记录的默认数据类型是 char(255)。若表中有超过 255 字符的字符串数据类型,需明确告知 SQLLDR 输入记录可包含超过 255 个字符。
**示例**:
```sql
EODA@ORA12CR1> alter table dept modify dname varchar2(1000);
Table altered.
```
控制文件如下:
```plaintext
LOAD DATA
INFILE *
INTO TABLE DEPT
FIELDS TERMINATED BY ','
(DEPTNO, DNAME, LOC)
BEGINDATA
10,Sales,Virginia
20,Accounting,Virginia
30,Consulting,Virginia
40,Finance more text more text more text more ... <repeated many times> ...more text,Virginia
```
运行 SQLLDR 会出现上述错误。解决方法是在控制文件中指定字段的最大宽度:
```plaintext
LOAD DATA
INFILE *
INTO TABLE DEPT
FIELDS TERMINATED BY ','
(DEPTNO, DNAME char(1000), LOC)
BEGINDATA ...
```
### 2.2 如何加载分隔数据
分隔数据是当今平面文件最流行的数据格式,常见的分隔数据格式有逗号分隔值(CSV)格式和制表符分隔数据格式。
#### 2.2.1 CSV 格式
在 CSV 格式中,每个数据字段用逗号分隔,文本字符串可用引号括起来,若字符串包含引号,需将引号加倍。
**示例控制文件**:
```plaintext
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(DEPTNO, DNAME, LOC)
BEGINDATA
10,Sales,"Virginia,USA"
20,Accounting,"Va, ""USA"""
30,Consulting,Virginia
40,Finance,Virginia
```
运行 SQLLDR 后,查询结果如下:
```plaintext
EODA@ORA12CR1> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 Sales Virginia,USA
20 Accounting Va, "USA"
30 Consulting Virginia
40 Finance Virginia
```
#### 2.2.2 制表符分隔数据格式
加载制表符分隔数据有两种方式:
- `TERMINATED BY X'09'`:使用十六进制格式的制表符。
- `TERMINATED BY WHITESPACE`:按空白字符分隔。
**示例控制文件(TERMINATED BY WHITESPACE)**:
```plaintext
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY WHITESPACE
(DEPTNO, DNAME, LOC)
BEGINDATA
10 Sales Virginia
```
实际数据行:`10\t\tSales\t\tVirginia`
查询结果:
```plaintext
EODA@ORA12CR1> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 Sales Virginia
```
**示例控制文件(TERMINATED BY X'09')**:
```plaintext
...
FIELDS TERMINATED BY X'09'
(DEPTNO, DNAME, LOC)
...
```
查询结果:
```plaintext
EODA@ORA12CR1> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 Sales
```
#### 2.2.3 跳过列
加载分隔数据时,常需跳过输入记录中的某些列。可使用 SQLLDR 提供的 `FILLER` 关键字。
**示例控制文件**:
```plaintext
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY x'09'
(DEPTNO, dummy1 filler, DNAME, dummy2 filler, LOC)
BEGINDATA
10 Sales Virginia
```
查询结果:
```plaintext
EODA@ORA12CR1> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 Sales Virginia
```
### 2.3 如何加载固定格式数据
固定宽度的位置数据是 SQLLDR 加载的最佳数据格式,处理速度快。加载固定宽度位置数据需在控制文件中使用 `POSITION` 关键字。
**示例控制文件**:
```plaintext
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
( DEPTNO position(1:2),
DNAME position(3:16),
LOC position(17:29)
)
BEGINDATA
10Accounting Virginia,USA
```
使用 `POSITION` 时,可使用相对或绝对偏移量,还可混合使用。
**示例控制文件(使用相对偏移量)**:
```plaintext
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
( DEPTNO position(1:2),
DNAME position(*:16),
LOC position(*:29),
ENTIRE_LINE position(1:29)
)
BEGINDATA
10Accounting Virginia,USA
```
也可
0
0
复制全文
相关推荐










