前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >领会ORA-01405错误的含义和解决

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

作者头像
bisal
发布2019-04-18 17:06:39
1.4K0
发布2019-04-18 17:06:39
举报
文章被收录于专栏:bisal的个人杂货铺

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1415364

这是杂货铺的第458篇文章

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

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

exec sql begin declare section; char insert_time300; 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_timei;   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的真实含义,才能顺藤摸瓜,找到导致错误的原因。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年04月09日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档