sqlldr加载文件,ORA-01722: invalid number

本文介绍了一种常见的CSV文件导入Oracle数据库时遇到的问题及其解决办法。主要问题是由于CSV文件末尾存在Windows系统的换行符导致数据类型冲突。通过调整表结构和使用dos2unix命令转换文件格式,最终实现了数据的成功导入。

dos2unix 文件:将文件转为unix模式(内为文本的)
案例:
csv文件
sqlldr.control文件
LOAD DATA
INTO TABLE TOTO
FIELDS TERMINATED BY','
(BALL_No,MAIN_BALL_FREQUENCY,ADDITIONAL_NO_FREQUENCY)
sqlldr.data文件
通过ftp传上来的一个csv文件 /s01/sqlldr/toto.csv

sqlldr k24/k24control=sqlldr.control log=toto.log
问题:死活导入不进去,查看toto.log
Record 1: Rejected - Error on table K24.TOTO, column ADDITIONAL_NO_FREQUENCY.
ORA-01722: invalid number
每行都报这个错误
分析原因:被sqlldr导入的表,最后一列是数字型,而我的csv文件中也是数字,报错非可用的数字,那我有理由怀疑在csv文件的每行最后都有一个回车符(windows中文本格式都有这个东西)
测试解决:
1、alter table toto modify ADDITIONAL_NO_FREQUENCY varchar2(20);
再次执行sqlldr 发现数据成功导入
这个结论再次验证了确实在全是数字的csv文本的最后,有不属于数字的东西,那就只有回车符了
2、dos2unixtoto.csv(这个命令会把windows中的文本转成linux格式的文本,其实就是把回车符给去掉)
3、将toto中的数据先行清除,然后将最后一列格式改回
alter table toto modify ADDITIONAL_NO_FREQUENCY number;
再次执行sqlldr。
select 表,发现已经导入成功。


改了一下controlfile
LOADDATA
INFILE'toto.csv'
BADFILE'toto.bad'
APPEND
INTOTABLEtoto
TRAILINGNULLCOLS
(
BALL_NOINTEGEREXTERNALTERMINATEDBY',',
MAIN_BALL_FREQUENCYINTEGEREXTERNALTERMINATEDBY',',
ADDITIONAL_NO_FREQUENCYINTEGEREXTERNALTERMINATEDBYwhitespace
)
### 解决 SQL*Loader - 704 内部错误(ulconnect: OCIServerAttach [0])的方法 - **检查 Oracle 客户端和服务器版本兼容性**:确保所使用的 Oracle 客户端版本与服务器版本兼容。版本不匹配可能会导致连接问题,引发 SQL*Loader - 704 错误。 - **检查环境变量设置**:确认 `ORACLE_HOME`、`PATH`、`LD_LIBRARY_PATH`(对于 Linux 系统)等环境变量是否正确设置。例如,在 Linux 系统中,可以通过以下命令查看和设置环境变量: ```bash echo $ORACLE_HOME export ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1 ``` - **检查网络连接**:确保客户端和服务器之间的网络连接正常,可通过 `ping` 命令测试网络连通性,使用 `tnsping` 命令测试 TNS 连接: ```bash ping <server_ip> tnsping <tns_name> ``` - **检查监听器状态**:确保 Oracle 监听器正在运行,可使用以下命令检查和启动监听器: ```bash lsnrctl status lsnrctl start ``` ### 解决 ORA - 12504(TNS: 监听程序在 CONNECT_DATA 中未获得 SERVICE_NAME)的方法 - **检查 TNS 配置文件**:确认 `tnsnames.ora` 文件中是否正确配置了 `SERVICE_NAME`。示例 `tnsnames.ora` 配置如下: ```plaintext ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = your_host)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) ``` - **检查 SQL*Loader 命令中的连接信息**:确保在 SQL*Loader 命令中正确指定了 `SERVICE_NAME`。例如: ```plaintext sqlldr userid=username/password@orcl control=control.ctl ``` - **检查数据库服务状态**:确保数据库服务正在运行,并且 `SERVICE_NAME` 正确注册到监听器。可以使用以下命令检查数据库服务状态: ```sql SELECT value FROM v$parameter WHERE name = 'service_names'; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值