查看: 19083|回复: 10

[PL/SQL] 如何规避异常ORA-01403?

[复制链接]
论坛徽章:
9
茶鸡蛋
日期:2011-12-28 08:44:392012新春纪念徽章
日期:2012-01-04 11:49:54优秀写手
日期:2013-12-18 09:29:152014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11
跳转到指定楼层
1#
发表于 2007-9-24 19:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[php]

DECLARE
flag NUMBER(2);
BEGIN
SELECT 1 INTO flag FROM mytable WHERE ID = 123;
IF flag = 1 THEN
    dbms_output.put_line('记录123存在');
ELSE
    dbms_output.put_line('记录123不存在');
END IF;
END;
/

[/php]

想当然的认为程序能正常运行,但是当记录真的不存在的时候,程序却抛出了异常ORA-01403。

不知道想要实现这样的逻辑该如何做比较好?

-------------------------------------------------------------------------------------------------------------------
这是程序逻辑的一部分,不管在表mytable中是否能找到记录,都能给我一个明确的答复,然后程序继续执行下去。
论坛徽章:
33
红孩儿
日期:2006-04-13 07:34:50ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54玉石琵琶
日期:2012-02-21 15:04:38奥运会纪念徽章:射击
日期:2012-08-10 11:01:09ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07
2#
发表于 2007-9-24 19:32 | 只看该作者
[php]
SQL> set serveroutput on
SQL> DECLARE
  2   flag NUMBER(2);
  3  BEGIN
  4   SELECT nvl(max(1),0) INTO flag FROM mytable WHERE ID = 123;
  5   IF flag = 1 THEN
  6      dbms_output.put_line('记录123存在');
  7   ELSE
  8      dbms_output.put_line('记录123不存在');
  9   END IF;
10  END;
11  /
记录123不存在

PL/SQL 过程已成功完成。
[/php]

使用道具 举报

回复
论坛徽章:
9
茶鸡蛋
日期:2011-12-28 08:44:392012新春纪念徽章
日期:2012-01-04 11:49:54优秀写手
日期:2013-12-18 09:29:152014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11
3#
 楼主| 发表于 2007-9-24 19:37 | 只看该作者
谢谢,你的这个办法很妙!

我刚才搜索了一下,有人认为用游标来代替,但是我觉得你的办法更好!

使用道具 举报

回复
论坛徽章:
9
茶鸡蛋
日期:2011-12-28 08:44:392012新春纪念徽章
日期:2012-01-04 11:49:54优秀写手
日期:2013-12-18 09:29:152014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11
4#
 楼主| 发表于 2007-9-24 19:40 | 只看该作者
另外一种办法就是使用异常处理:
[php]
DECLARE
flag NUMBER(2);
BEGIN
BEGIN
         SELECT 1 INTO flag FROM mytable WHERE ID = 123;
         IF flag = 1 THEN
                dbms_output.put_line('记录123存在');
                      END IF;
EXCEPTION
        WHEN OTHERS THEN
                     dbms_output.put_line('记录123不存在');
END;
END;
/

[/php]

使用道具 举报

回复
论坛徽章:
24
生肖徽章:狗
日期:2006-09-07 10:14:43数据库板块每日发贴之星
日期:2008-07-26 01:02:20生肖徽章2007版:兔
日期:2008-10-13 11:10:11奥运会纪念徽章:铁人三项
日期:2008-10-24 13:27:21开发板块每日发贴之星
日期:2008-12-27 01:01:09生肖徽章2007版:马
日期:2009-11-18 10:45:032010新春纪念徽章
日期:2010-03-01 11:21:02ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51ERP板块每日发贴之星
日期:2011-05-18 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
5#
发表于 2007-9-24 19:45 | 只看该作者
不明白判断记录是否存在为何不用count呢??

完全可以避免这个异常!

使用道具 举报

回复
论坛徽章:
33
红孩儿
日期:2006-04-13 07:34:50ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54玉石琵琶
日期:2012-02-21 15:04:38奥运会纪念徽章:射击
日期:2012-08-10 11:01:09ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07
6#
发表于 2007-9-24 19:57 | 只看该作者
SELECT nvl(max(id), 0) INTO flag FROM mytable WHERE ID = 123 and rownum =1;
有些情况下可以直接赋值的作用。

使用道具 举报

回复
论坛徽章:
9
茶鸡蛋
日期:2011-12-28 08:44:392012新春纪念徽章
日期:2012-01-04 11:49:54优秀写手
日期:2013-12-18 09:29:152014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11
7#
 楼主| 发表于 2007-9-24 20:04 | 只看该作者
最初由 hanjs 发布
[B]不明白判断记录是否存在为何不用count呢??

完全可以避免这个异常! [/B]


也是啊!哈哈。

使用道具 举报

回复
论坛徽章:
24
生肖徽章:狗
日期:2006-09-07 10:14:43数据库板块每日发贴之星
日期:2008-07-26 01:02:20生肖徽章2007版:兔
日期:2008-10-13 11:10:11奥运会纪念徽章:铁人三项
日期:2008-10-24 13:27:21开发板块每日发贴之星
日期:2008-12-27 01:01:09生肖徽章2007版:马
日期:2009-11-18 10:45:032010新春纪念徽章
日期:2010-03-01 11:21:02ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51ERP板块每日发贴之星
日期:2011-05-18 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
8#
发表于 2007-9-24 20:13 | 只看该作者
最初由 nokilled 发布
[B]SELECT nvl(max(id), 0) INTO flag FROM mytable WHERE ID = 123 and rownum =1;
有些情况下可以直接赋值的作用。 [/B]


可能是我没有用到过,呵呵!学了

使用道具 举报

回复
论坛徽章:
7
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:鸡
日期:2008-01-02 17:35:53生肖徽章2007版:猴
日期:2008-01-02 17:35:53生肖徽章2007版:兔
日期:2008-01-02 17:35:53生肖徽章2007版:虎
日期:2008-01-02 17:35:53生肖徽章2007版:牛
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:53
9#
发表于 2007-9-25 10:06 | 只看该作者
个人感觉游标办法适用于更复杂判断逻辑的情况。

使用道具 举报

回复
论坛徽章:
31
会员2006贡献徽章
日期:2006-04-17 13:46:342010新春纪念徽章
日期:2010-03-01 11:08:292010年世界杯参赛球队:希腊
日期:2010-05-12 15:47:582010广州亚运会纪念徽章:自行车
日期:2010-11-22 15:27:37ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54蛋疼蛋
日期:2012-06-02 20:36:30奥运会纪念徽章:排球
日期:2012-09-05 10:56:112013年新春福章
日期:2013-02-25 14:51:24咸鸭蛋
日期:2013-03-25 12:17:01
10#
发表于 2007-9-25 11:35 | 只看该作者
直接用NO_DATA_FOUND 异常即可,没必要搞那么复杂,例如:
DECLARE
   flag   NUMBER (2);
BEGIN
   SELECT NULL
     INTO flag
     FROM mytable
    WHERE ID = 123;

   DBMS_OUTPUT.put_line ('记录123存在');
EXCEPTION
   WHEN NO_DATA_FOUND
   THEN
      DBMS_OUTPUT.put_line ('记录123不存在');
END;
/

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表