测试TOM=SQLLOADER加载制表符号数据

本文详细介绍了如何使用SQL*Loader通过制表符来加载数据,并通过实例展示了两种加载方法的区别及操作步骤。重点讨论了如何在SQL*Loader中设置制表符作为数据分隔符,并通过控制文件实现数据加载。此外,还对比了使用制表符与使用空白字符作为分隔符的效果,提供了实用的案例分析。
用字表符分割的数据,有两种加载办法
1.TERMINATED BY  X '09'
2.TERMINATED BY WHITESPACE
=============以WHITESPACE来测试制表符数据的加载=================
会话1:清空测试表数据,创建新的控制文件加载新的带有制表符号的数据。

SQL> select * from dept_load;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 sales          abc,usa
        20 aaa            xx,"yy"
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SQL> truncate table dept_load;

Table truncated.

SQL> 

会话1:建立新的控制文件如下
[oracle@oraclelinux ~]$ ls -ltr dept*
-rw-r--r--  1 oracle oinstall  202 May 11 16:02 dept_load2.ctl
-rw-r--r--  1 oracle oinstall 1679 May 11 16:03 dept_load2.log
-rw-r--r--  1 oracle oinstall    1 May 11 16:03 dept_load2.bad
[oracle@oraclelinux ~]$ rm -rf dept*
[oracle@oraclelinux ~]$ ls -ltr dept*
ls: dept*: No such file or directory
[oracle@oraclelinux ~]$ vi dept_load3.ctl

load data
infile *
into table dept_load
replace
fields terminated by whitespace
(deptno,dname,loc)
begindata
10              sales           virginia
~
~
~

会话1:加载新数据
[oracle@oraclelinux ~]$  sqlldr userid=scott/scott control=dept_load3.ctl

SQL*Loader: Release 10.2.0.1.0 - Production on Mon May 14 10:34:02 2012

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Commit point reached - logical record count 1
[oracle@oraclelinux ~]$ ls -ltr dept8
ls: dept8: No such file or directory
[oracle@oraclelinux ~]$ ls -ltr dept*
-rw-r--r--  1 oracle oinstall  129 May 14 10:32 dept_load3.ctl
-rw-r--r--  1 oracle oinstall 1548 May 14 10:34 dept_load3.log
[oracle@oraclelinux ~]$ exit
exit

SQL> select * from dept_load;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 sales          virginia

SQL> !
[oracle@oraclelinux ~]$ more dept_load3.log

SQL*Loader: Release 10.2.0.1.0 - Production on Mon May 14 10:34:02 2012

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Control File:   dept_load3.ctl
Data File:      dept_load3.ctl
  Bad File:     dept_load3.bad
  Discard File:  none specified
 
 (Allow all discards)

Number to load: ALL
Number to skip: 0
Errors allowed: 50
Bind array:     64 rows, maximum of 256000 bytes
Continuation:    none specified
Path used:      Conventional

Table DEPT_LOAD, loaded from every logical record.
Insert option in effect for this table: REPLACE

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
DEPTNO                              FIRST     *  WHT      CHARACTER            
DNAME                                NEXT     *  WHT      CHARACTER            
LOC                                  NEXT     *  WHT      CHARACTER            


Table DEPT_LOAD:
  1 Row successfully loaded.
  0 Rows not loaded due to data errors.
  0 Rows not loaded because all WHEN clauses were failed.
  0 Rows not loaded because all fields were null.


Space allocated for bind array:                  49536 bytes(64 rows)
Read   buffer bytes: 1048576

Total logical records skipped:          0
Total logical records read:             1
Total logical records rejected:         0
Total logical records discarded:        0

Run began on Mon May 14 10:34:02 2012
Run ended on Mon May 14 10:34:02 2012

Elapsed time was:     00:00:00.59
CPU time was:         00:00:00.07
[oracle@oraclelinux ~]$ 

=====================使用16进制格式的制表符号====================
会话1:清空测试表DEPT_LOAD,创建新控制文件
[oracle@oraclelinux ~]$ ls -ltr dept*
-rw-r--r--  1 oracle oinstall  129 May 14 10:32 dept_load3.ctl
-rw-r--r--  1 oracle oinstall 1548 May 14 10:34 dept_load3.log
[oracle@oraclelinux ~]$ cp dept_load3.ctl dept_load4.ctl
[oracle@oraclelinux ~]$ rm -rf dept_load3.*
[oracle@oraclelinux ~]$ vi dept_load4.ctl

      1 load data
      2 infile *
      3 into table dept_load
      4 replace
      5 fields terminated by X'09'====16进制的制表符号表示方法
      6 (deptno,dname,loc)
      7 begindata
      8 10              sales           virginia
~


[oracle@oraclelinux ~]$ sqlldr userid=scott/scott control=dept_load4.ctl

SQL*Loader: Release 10.2.0.1.0 - Production on Mon May 14 10:42:54 2012

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Commit point reached - logical record count 1
[oracle@oraclelinux ~]$ exit
exit

SQL> select * from dept_load;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10                sales

SQL> 
测试结果发现在此,一旦SQLLDR 遇到一个制表符,就会输出一个值。因此,将10 赋给DEPTNO,DNAME 得到了NULL,
因为在第一个制表符和制表符的下一次出现之间没有数据。Sales 赋给了LOC。

这个时候如果我们把数据中的制表符号由两个变成一个,那么DNAME就会正常显示



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15720542/viewspace-723490/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15720542/viewspace-723490/

下面是一段**完整的 SQL 脚本代码**,用于: - 创建 `employee` 表 - 插入多条测试数据 - 执行更新、删除操作 - 使用 `SELECT` 查看每一步的结果 你可以将这段代码直接在 MySQL 客户端(如 MySQL Workbench、命令行、phpMyAdmin 等)中运行,来测试整个流程。 --- ### ✅ 完整的 SQL 测试脚本 ```sql -- ================== 1. 删除旧表(如果存在),便于重复测试 ================== DROP TABLE IF EXISTS employee; -- ================== 2. 创建 employee 表 ================== CREATE TABLE employee ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, department VARCHAR(100), salary DECIMAL(10, 2) ); -- ================== 3. 插入多条测试数据 ================== INSERT INTO employee (name, department, salary) VALUES ('John Doe', 'HR', 5000.00), ('Jane Smith', 'Engineering', 7000.00), ('Mike Lee', 'Engineering', 6800.00), ('Linda Park', 'Marketing', 4500.00), ('Tom Allen', 'HR', 4800.00); -- ================== 4. 查看插入后的所有数据 ================== SELECT '--- 插入后数据 ---' AS message; SELECT * FROM employee; -- ================== 5. 更新:将 John Doe 的薪资提高到 5500.00 ================== UPDATE employee SET salary = 5500.00 WHERE name = 'John Doe'; SELECT '--- 更新 John Doe 薪资后 ---' AS message; SELECT * FROM employee WHERE name = 'John Doe'; -- ================== 6. 删除:删除名为 Tom Allen 的员工 ================== DELETE FROM employee WHERE name = 'Tom Allen'; SELECT '--- 删除 Tom Allen 后的数据 ---' AS message; SELECT * FROM employee; -- ================== 7. 最终数据快照 ================== SELECT '--- 最终表中所有数据 ---' AS message; SELECT * FROM employee; ``` --- ### 📌 代码解释 | 部分 | 功能说明 | |------|----------| | `DROP TABLE IF EXISTS employee;` | 如果之前有 `employee` 表,先删除它,避免重复创建报错,方便反复测试。 | | `CREATE TABLE ...` | 创建符合要求的 `employee` 表结构。 | | `INSERT INTO ... VALUES (...), (...), ...` | 一次性插入多条测试数据,提高效率。 | | `SELECT '--- message ---' AS message;` | 输出提示信息,帮助你在结果中识别每个操作阶段(MySQL 中可通过查询显示文字提示)。 | | `UPDATE ... WHERE name = 'John Doe'` | 更新指定员工的薪资。 | | `DELETE FROM ... WHERE name = 'Tom Allen'` | 删除指定员工记录。 | | 多次 `SELECT * FROM employee` | 检查各阶段数据状态,验证操作是否生效。 | --- ### 🧪 示例输出(简要) 执行后你可能会看到类似如下结果片段: ``` +------------------------+ | message | +------------------------+ | --- 插入后数据 --- | +------------------------+ +----+------------+---------------+---------+ | id | name | department | salary | +----+------------+---------------+---------+ | 1 | John Doe | HR | 5000.00 | | 2 | Jane Smith | Engineering | 7000.00 | | 3 | Mike Lee | Engineering | 6800.00 | | 4 | Linda Park | Marketing | 4500.00 | | 5 | Tom Allen | HR | 4800.00 | +----+------------+---------------+---------+ ... +----+------------+------------+---------+ | id | name | department | salary | +----+------------+------------+---------+ | 1 | John Doe | HR | 5500.00 | +----+------------+------------+---------+ ... +----+------------+---------------+---------+ | id | name | department | salary | +----+------------+---------------+---------+ | 1 | John Doe | HR | 5500.00 | | 2 | Jane Smith | Engineering | 7000.00 | | 3 | Mike Lee | Engineering | 6800.00 | | 4 | Linda Park | Marketing | 4500.00 | +----+------------+---------------+---------+ ``` > 注意:`Tom Allen` 已被删除,`John Doe` 的薪资已更新为 `5500.00`。 --- ### ✅ 建议改进(生产环境) 虽然这里用 `name` 做条件是为了演示方便,但在实际开发中应尽量使用主键 `id` 来操作,例如: ```sql UPDATE employee SET salary = 5500.00 WHERE id = 1; DELETE FROM employee WHERE id = 5; ``` 这样更安全、高效,避免因重名导致误操作。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值