领会ORA-01405错误的含义和解决

这是杂货铺的第458篇文章


在写Oracle proc程序的时候,经常会判断,sqlca.sqlcode是否是1405,这次应用搬迁,再次领会了他的真实作用。


原始code的片段,首先变量定义,

exec sql begin declare section;

char insert_time[300][21];

exec sql end declare section;

具体使用,

exec sql at database declare test_cursor cursor for

select to_char(insert_time, 'DDMONYYYY') from test;

exec sql open test_cursor;

for (i = 0; i<1000; i++) {

  exec sql fetch test_cursor

  into :insert_time[i];

  if (sqlca.sqlcode != 0) break;

}

exec sql close test_cursor;


现象就是,在测试环境中,虽然数据库中符合条件的记录,不止一条,但实际能读到的,就只有第一条。


对比了很多次生产和测试数据,才发现些许不同,测试环境中,第一条数据insert_time字段值为空。这就要看ORA-01405的解释,是指fetched column value is NULL,即取出的某个值是NULL。读到第一条,就因为字段insert_time,值空,因此返回了sqlca.sqlcode=1405,导致退出循环。


此处一种处理NULL值的方法,就是使用nvl函数,即NVL(string, replace),如果string为NULL,则NVL函数返回replace的值,否则返回string的值,前提是string和replace必须为同一数据类型。


所以,这条SQL,

select to_char(insert_time, 'DDMONYYYY') from test;

需要改写为,

select nvl(to_char(insert_time, 'DDMONYYYY'), ' ') from test;

即过滤掉insert_time为空的情况,避免出现sqlca.sqlcode=1405,就可以在循环内,正常读所有数据。


因此,ORA错误的描述信息虽然简短,但其实是指明方向的路灯,是需要了解清楚每个ORA的真实含义,才能顺藤摸瓜,找到导致错误的原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值