使用SQLLDR导入日志

本文详细介绍了如何使用SQLLDR导入Oracle数据库的日志数据,强调了在使用序列时不能添加DIRECT=TRUE选项。同时,分享了如何创建定时任务通过shell脚本来执行导入,并提醒了权限设置和环境变量配置的重要性。在遇到数据导入异常,如字段长度超过默认限制时,需在CTL文件中指定字段长度。

Load data --加载数据
append into table TEST --数据表TEST
fields terminated by ':' --每行日志以“:”分隔
trailing nullcols
(----下面为表中属性
DNAME "nvl(:DNAME,'-')", --如果DNAME为null,则插入默认值“-”
MENO,
ID "SEQ_TEST.nextval" --调用序列
)


在这里需要注意:如果要使用序列,就不能加DIRECT=TRUE

执行命令:
sqlldr userid=帐号/密码@SID control=f:\test.ctl data=f:\test.log


参考链接:
http://hi.baidu.com/danghj/blog/item/393dca1baf79faddad6e75dd.html
http://topic.youkuaiyun.com/u/20090901/16/6f47eca3-169b-4ecc-9e6c-063055d9a392.html
http://wxy0327.itpub.net/post/16888/96826
http://chinapkw.iteye.com/blog/568948


========================================================20101119补充
如何定时使用shell导入数据
vi import_data.sh
内容:
. /home/oracle/.bash_profile 
lastLogDate=`date -d "-1 minute" +%Y%m%d.%H.%M`
/data/oracle/10.2.0.1/bin/sqlldr userid=webtrace/webtrace@webtra
<think>我们正在讨论OracleSQL*Loader中设置字段分隔符的方法。用户的问题是如何在使用SQL*Loader导入文件时设置字段分隔符。根据引用[2]和引用[4],我们可以知道SQL*Loader允许通过`TERMINATEDBY`子句来指定字段分隔符。引用[2]中提到了使用`TERMINATEDBYWHITESPACE`(以空白符分隔)的情况,以及使用制表符作为分隔符的例子。引用[4]也提到在导入数据时,文件内容需要有格式和规律,并且可以通过指定分隔符来解析字段。具体方法是在控制文件(.ctl)中定义字段时,使用`TERMINATEDBY`来指定分隔符。例如:-`TERMINATEDBY','`表示用逗号分隔-`TERMINATEDBYX'09'`表示用制表符(ASCII码09)分隔-`TERMINATEDBY'|'`表示用竖线分隔此外,还可以使用`TERMINATEDBYWHITESPACE`表示以空白字符(空格、制表符等)作为分隔符。下面是一个示例控制文件,其中指定了字段分隔符为逗号:```sqlLOADDATAINFILE'data.csv'INTOTABLEempFIELDSTERMINATEDBY','OPTIONALLYENCLOSEDBY'"'(empno,ename,job,mgr,hiredateDATE"YYYY-MM-DD",sal,comm,deptno)```如果分隔符是制表符,可以这样写:```sqlFIELDSTERMINATEDBYX'09'```如果分隔符是竖线,可以这样写:```sqlFIELDSTERMINATEDBY'|'```另外,引用[2]还提到了当使用`TERMINATEDBYWHITESPACE`时,如果字段值中包含空格,可能会导致问题,因为空格也被视为分隔符。因此,需要根据实际数据情况选择合适的分隔符。总结步骤:1.准备数据文件,确保数据文件中的字段分隔符是确定的(如逗号、制表符、竖线等)。2.编写控制文件(.ctl),在`FIELDSTERMINATEDBY`子句中指定分隔符。3.运行SQL*Loader命令,指定控制文件。运行命令示例:```bashsqlldruserid=username/password@databasecontrol=loader.ctl```这样,SQL*Loader就会根据指定的分隔符来解析数据文件并导入到数据库表中。§§相关问题§§1.如何解决SQL*Loader导入时因字段包含分隔符导致的问题?2.除了分隔符,SQL*Loader控制文件还有哪些常用参数?3.如何优化SQL*Loader导入大量数据的性能?</think>### 如何在 SQL*Loader 中设置字段分隔符 在 SQL*Loader 中设置字段分隔符主要通过控制文件(`.ctl`)中的 `FIELDS TERMINATED BY` 子句实现,以下是具体方法: #### 1. **基本语法** 在控制文件中指定分隔符格式: ```sql FIELDS TERMINATED BY '[分隔符]' ``` 其中 `[分隔符]` 可以是: - 可见字符:如 `','`(逗号)、`'|'`(竖线)、`';'`(分号) - 转义字符:如 `X'09'`(制表符)、`'\t'`(制表符) - 空白符:`TERMINATED BY WHITESPACE`(空格/制表符) #### 2. **示例控制文件** ```sql LOAD DATA INFILE 'data.txt' -- 数据文件路径 INTO TABLE employees -- 目标表名 FIELDS TERMINATED BY '|' -- 指定竖线为分隔符 OPTIONALLY ENCLOSED BY '"' -- 可选:引号包裹的字段 ( emp_id, name, hire_date DATE "YYYY-MM-DD", -- 日期格式处理 salary ) ``` #### 3. **特殊分隔符处理** - **制表符**:使用 `TERMINATED BY X'09'` 或 `TERMINATED BY '\t'` ```sql FIELDS TERMINATED BY X'09' -- 16进制ASCII码表示 ``` - **多字符分隔符**(如 `||`): ```sql FIELDS TERMINATED BY '||' ``` #### 4. **注意事项 - **空值处理**:若分隔符连续出现(如 `A||C`),中间字段会被解析为 `NULL`[^2]。 - **字段包含分隔符**:使用 `OPTIONALLY ENCLOSED BY '"'` 包裹含分隔符的字段(如 `"Smith, John"`)。 - **性能优化**:对大文件添加 `DIRECT=TRUE` 参数(直接路径加载)。 #### 5. **执行命令** ```bash sqlldr user/password@db control=loader.ctl ``` > **关键场景对比** > | 分隔符类型 | 控制文件写法 | 适用场景 | > |------------------|-----------------------------|-----------------------| > | 逗号`,` | `TERMINATED BY ','` | CSV文件 | > | 制表符 | `TERMINATED BY X'09'` | TSV/Excel导出数据 | > | 竖线`|` | `TERMINATED BY '|'` | 管道分隔日志 | > | 多字符`||` | `TERMINATED BY '||'` | 自定义复杂分隔 | > | 空格/制表符混合 | `TERMINATED BY WHITESPACE` | 对齐的固定宽度数据[^2] | [^1]: 分隔符定义直接影响字段映射准确性,需与数据文件严格一致。 [^2]: 连续分隔符会导致空值插入,需确保数据格式规范。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值