sqluldr2 报错ora-24345: A Truncation or null fetch error occurred

本文详细解析了在使用SQL*Loader进行数据导入时遇到的ORA-24345及ORA-00923错误原因,介绍了增大缓冲区避免ORA-24345错误的方法,并提供了解决FROM关键字缺失导致ORA-00923错误的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

source /etc/profile;source /root/.bash_profile;unset NLS_LANG;
sqluldr2 user=sjgj/sjgj@10.254.4.196:1521/client 
query="select ZJ  as ZJ,TIME  as TIME,DHHM  as DHHM,XM  as XM,LDNR  as LDNR,BLLC  as BLLC,LAQK  as LAQK,BLBM  as BLBM,BLJG  as BLJG,SBNR  as SBNR,TP  as TP,FKTP  as FKTP,SX  as SX,SFCS  as SFCS,SBRY  as SBRY,CREATETIME  as CREATETIME,UPDATETIME  as UPDATETIME,SEQ  as SEQ,UPDATESTATUS  as UPDATESTATUS,SYS_KEY  as SYS_KEY   from SJGJ.WXJBSJ WHERE 1=1" 
head=no 
file=/home/ioc/SourceQulifier_0_a9bd1b8aadb744cd81552787587aa2e9.dat 
field=0x01 
log=/home/ioc/SourceQulifier_0_a9bd1b8aadb744cd81552787587aa2e9.log 
charset=utf8 
safe=yes

sqluldr2的报错日志为: 0 rows exported at 2018-11-07 16:26:48, size 0 MB. 

ORA-24345: A Truncation or null fetch error occurred
sqluldr2的报错日志为:
ORA-00923: FROM keyword not found where expected

解决办法:

默认的buffer太小,不够存放大量数据

safe    = use large buffer to avoid ORA-24345 error (Yes|No) 

在sqluldr2命令中添加参数safe=yes,问题依然得不到解决

将CLOB类型数据不做迁移,问题即解决,但这种只是基于字段价值不高···············

内容来自互联网,如有侵权通知后删除 sqluldr2是一款Oracle数据快速导出工具,包含32、64位程序,sqluldr2在大数据量导出方面速度超快,能导出亿级数据为excel文件,另外它的导入速度也是非常快速,功能是将数据以TXT/CSV等格式导出,有需要的赶快下载吧! oracle数据导出工具sqluldr2 基本简介   下载完sqluldr解压后,文件夹内容如下:   sqluldr2.exe 用于32位windows平台;   sqluldr2_linux32_10204.bin 适用于linux32位操作系统;   sqluldr2_linux64_10204.bin 适用于linux64位操作系统;   sqluldr264.exe 用于64位windows平台。 使用方法   1、首先将sqluldr2.exe复制到执行目录下,即可开始使用   2、查看help 帮助 sqluldr2 官方下载   3、执行数据导出命令   3.1、常规导出   sqluldr2 test/test@127.0.1.1/orcl query="select * from temp_001" head=yes file=d:\tmp001.csv   说明:head=yes 表示输出表头 oracle数据导出工具sqluldr2   3.2、使用sql参数   sqluldr2 test/test@127.0.1.1/orcl sql=test_sql.sql head=yes file=d:\tmp001.csv   test_sql的内容为:   select * from temp_001 sqluldr2 官方下载   3.3、使用log参数   当集成sqluldr2在脚本中时,就希望屏蔽上不输出这些信息,但又希望这些信息能保留,这时可以用“LOG”选项来指定日志文件名。   sqluldr2 test/test@127.0.1.1/orcl sql=test_sql.sql head=yes file=d:\tmp001.csv log=+d:\tmp001.log oracle数据导出工具sqluldr2   3.4、使用 table 参数   当使用 table 参数时,在目录下会生成对应的ctl控制文件,如下语句会生成temp_001_sqlldr.ctl文件。   sqluldr2 test/test@127.0.1.1/orcl query="select * from temp_001" table=temp_001 head=yes file=d:\tmp001.csv sqluldr2 官方下载   生成的控制文件temp_001_sqlldr.ctl的内容如下: oracle数据导出工具sqluldr2   4、主要参数说明   Field 分隔符 指定字段分隔符,默认为逗号   record 分隔符 指定记录分隔符,默认为回车换行,Windows下的换行   quote 引号符 指定非数字字段前后的引号符   例如现在要改变默认的字段分隔符,用“#”来分隔记录,导出的命令如下所示:   sqluldr2 test/test sql=tmp.sql field=#   在指定分隔符时,可以用字符的ASCII代码(0xXX,大写的XX为16进制的ASCII码值)来指定一个字符,常用的字符的ASCII代码如下:   回车=0x0d,换行=0x0a,TAB键=0x09,|=0x7c,&=0x26,双引号=0x22,单引号=0x27   在选择分隔符时,一定不能选择会在字段值中出现的字符
### DBD::Oracle ORA-24345 错误分析 当使用 `DBD::Oracle` 进行数据库操作时,遇到 `ORA-24345: A truncation or null fetch error occurred` 的错误通常是因为某些列的数据长度超出了默认的读取缓冲区大小。这种情况下,可以通过调整 `LongReadLen` 参数来解决问题。 #### 配置 LongReadLen 参数 在 Perl 中使用 `DBI` 和 `DBD::Oracle` 时,可以通过设置 `$sth->{LongReadLen}` 来指定最大可读取的 CLOB 或 LONG 数据长度。默认值通常是较小的数值(如 80 字节),这可能导致大数据量的列无法完全加载到内存中[^1]。 以下是配置方法的一个示例: ```perl use DBI; my $dbh = DBI->connect('dbi:Oracle:host=your_host;sid=your_sid', 'username', 'password', { RaiseError => 1 }); # 设置 LongReadLen 大小为更大的值,例如 1MB (1_048_576 bytes) $dbh->{LongReadLen} = 1_048_576; my $sth = $dbh->prepare(q{ SELECT large_column FROM your_table WHERE condition = ? }); $sth->execute($value); while (my @row = $sth->fetchrow_array()) { print "@row\n"; } $sth->finish(); $dbh->disconnect(); ``` 通过增加 `LongReadLen` 值,可以确保能够处理较大的 LOB 列或 LONG 类型数据而不会截断。 #### 启用 LongTruncOk 属性 除了增大 `LongReadLen`,还可以启用 `LongTruncOk` 属性允许部分读取而不抛出异常。此属性的作用是在数据超出设定范围时仅获取部分内容并继续运行程序而不是终止执行流程[^2]。 下面是如何应用该选项的例子: ```perl use DBI; my $dbh = DBI->connect('dbi:Oracle:host=your_host;sid=your_sid', 'username', 'password', { RaiseError => 1 }); $dbh->{LongReadLen} = 1_048_576; $dbh->{LongTruncOk} = 1; # 允许截断大对象 my $sth = $dbh->prepare(q{ SELECT long_text_field FROM some_large_data_table }); $sth->execute(); while (my ($data) = $sth->fetchrow_array()) { print substr($data, 0, 100), "\n"; # 打印前100字节作为演示 } $sth->finish(); $dbh->disconnect(); ``` 以上脚本设置了两个重要参数——一个是定义最长能接受多少字节数(`LongReadLen`),另一个则是是否容忍超过这个界限仍然尝试去抓取剩余的部分(`LongTruncOk`)。 #### 调试建议 如果上述更改仍未能解决 `fetchall_arrayref` 出现的问题,则需进一步排查其他潜在原因: - **SQL 查询优化**: 对于涉及大量记录或者复杂联结的操作,考虑分页提取结果集以减少单次请求的压力。 - **绑定变量使用情况**: 确认所有动态条件均采用占位符形式传参而非拼接字符串方式构建最终语句体。 - **网络稳定性检测**: 排除因不稳定链接造成中途丢包现象影响正常通讯交互过程的可能性。 --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值