关于程序调用Sqlldr不出错但数据导入不成功的问题

本文探讨了使用SQL*Loader导入数据时遇到的问题及解决方案,重点分析了CTL文件中INFILE路径设置不当导致的问题,并提供了确保数据导入成功的实用建议。

一般碰到这种问题,都是手工执行命令导入是成功,但用程序调用就不成功了。

我也碰到了同样的问题,而且是在一台机器上程序调用sqlldr好用,在另一机器却不好用了。

仔细分析了一下问题,后来发现手工执行和程序调用的一个区别:

(1)手工执行:一般人都会在CMD下进入到CTL所在的目录,然后调用SQLLDR命令。执行成功。注意此时的当前路径已经在CTL所在的目录了。

(2)程序调用:程序调用时则是用同样的SQLLDR命令去执行,结果发现不报错,但数据却没有导入。注意此时的当前路径是在程序所在的目录下。

 

原因分析:

基于以上分析可看出大部分人执行不成功的原因是CTL中的INFILE路径不对(一般人都用相对路径,如XXX.txt),因为如果程序执行,会在程序的所在目录找数据文件,却找不到,所以失败了。这种情况是不会出错而且不会生成LOG(因为没执行)。

 

另外一个问题:我使用的是绝对路径,在一台机器A上好用,在另外一机器B导入数据不成功,这是怎么回事,想了好半天,发现一个现象:

在机器B上的程序是放在桌面上,生成的数据文件是放在桌面上的。

原因分析:

桌面的路径是:C:/Documents and Settings/XXX/桌面 问题就出在这,路径中有空格就出事了。改到没空格的路径一切正常。

 

 

结论:

INFILE路径设置建议:

(1)最好使用绝对路径,建议由程序动态生成CTL文件

(2)不要带有空格,到于对有空格的路径加上“”,是不是会好用,暂未试验。但加' '是不好用的,这个已经试过。

在使用 SQL*Loader (sqlldr) 进行数据导入时,尽管命令执行成功数据库中未显示数据的情况可能由多种原因引起。以下是一些常见的原因及相应的解决方法: ### 1. 控制文件中未正确指定数据文件路径或分隔符 - **原因**:如果 `infile` 指定的文件路径正确或文件名拼写错误,SQL*Loader 会尝试读取一个存在的文件,从而导致没有数据导入- **解决方法**:检查控制文件中 `infile` 参数是否正确指向目标数据文件,并确保文件确实存在于该路径下。同时确认字段之间的分隔符是否与数据文件中的实际分隔符一致,例如 `fields terminated by ','` 是否匹配数据文件中的逗号分隔。 ### 2. 表中已有数据未被覆盖或追加 - **原因**:控制文件中使用了 `INSERT` 模式(默认),而目标表中已经存在数据,这会导致 SQL*Loader 报告成功导入任何新数据- **解决方法**:根据需求修改控制文件中的加载模式。如果希望清空表后导入数据,可以使用 `REPLACE` 或 `TRUNCATE` 模式;如果希望保留原有数据并追加新数据,则使用 `APPEND` 模式。 ### 3. 数据类型匹配导致数据被忽略 - **原因**:数据文件中的字段类型与数据库表的列类型匹配,例如将字符串导入数值类型的列,可能导致某些记录被跳过。 - **解决方法**:检查数据文件中的每一列是否与目标表的列类型兼容。对于匹配的字段,可以在控制文件中使用 `NULLIF` 或 `DEFAULTIF` 等子句进行处理,或者在数据文件中预处理数据以确保一致性。 ### 4. 数据文件格式问题(如编码、换行符等) - **原因**:数据文件的编码格式或换行符与 SQL*Loader 预期的格式一致,可能导致读取错误或部分数据未被正确解析。 - **解决方法**:确保数据文件使用正确的编码格式(如 UTF-8 或 GBK),并且换行符符合操作系统的要求(Windows 通常使用 `\r\n`,Linux 使用 `\n`)。可以使用文本编辑工具检查并转换文件格式。 ### 5. SQL*Loader 日志文件未被仔细查看 - **原因**:虽然 SQL*Loader 报告“成功”,但日志文件中可能包含警告或错误信息,这些信息可能指示某些记录未能被正确导入- **解决方法**:查看 SQL*Loader 生成的日志文件(默认与控制文件同名,扩展名为 `.log`),查找其中的警告或错误信息,特别是 `Record X: Rejected - Error on table` 类似内容,以定位问题。 ### 6. 数据文件中存在空行或无效记录 - **原因**:数据文件中可能存在空行或格式错误的记录,这些记录会被 SQL*Loader 忽略,导致实际导入数据量少于预期。 - **解决方法**:在控制文件中添加 `BADFILE` 和 `DISCARDFILE` 参数,指定良记录和丢弃记录的输出文件,以便进一步分析哪些记录未能成功导入。 ### 示例控制文件(test.ctl) ```sql LOAD DATA INFILE 'test.txt' BADFILE 'test.bad' DISCARDFILE 'test.dsc' APPEND INTO TABLE test_table FIELDS TERMINATED BY "," (id, name, age) ``` ### 示例命令行调用 ```bash sqlldr username/password control=test.ctl ``` ### 7. 权限问题 - **原因**:当前用户可能没有对目标表的插入权限,或者对数据库的访问权限受限。 - **解决方法**:确认当前用户拥有对目标表的插入权限,并且能够连接到数据库。可以通过 SQL*Plus 或其他数据库客户端工具测试连接和权限。 ### 8. 数据库事务未提交 - **原因**:如果在控制文件中使用了 `BINDSIZE` 或 `ROWS` 参数,而 `READSIZE` 设置较大,可能导致事务未及时提交,数据尚未写入数据库。 - **解决方法**:确保 `ROWS` 参数设置合理,避免单次提交的数据量过大。也可以在控制文件中显式指定 `OPTIONS (SKIP=0, LOAD=10000)` 来控制每次提交的数据量。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值