引言:

今天看到的一句很有哲理的话: Dont blame the Car- Learn to be a Good Driver


1.为什么产生ORA-01403

ORA-01403: 未找到任何数据 异常主要是由于SQL中使用了SELECT INTO 但是根据条件没有查询到结果引起.

例如下数据表producten表中不存在名称为国内共享套餐的产品,此时获取DI就会得到报错

DECLAREV_ID NUMBER;
BEGINSELECT P.PRODUCTID_PKINTO V_IDFROM PRODUCTEN PWHERE P.PRODUCTNAMESTR = '国内共享套餐';DBMS_OUTPUT.put_line('产品ID=' || V_ID);END;ORA-01403: 未找到任何数据
ORA-06512: 在 line 5

2. 如何解决ORA-01403

如果只是解决报错问题,有两种常见方式

2.1 第一种方式就是提前检测

DECLAREV_COUNT NUMBER;V_ID    NUMBER;
BEGIN--先检查数据存在SELECT COUNT(*)INTO V_COUNTFROM PRODUCTEN PWHERE P.PRODUCTNAMESTR = '国内共享套餐';--然后处理IF V_COUNT > 0 THENSELECT P.PRODUCTID_PKINTO V_IDFROM PRODUCTEN PWHERE P.PRODUCTNAMESTR = '国内共享套餐';END IF;--做其他的事情DBMS_OUTPUT.put_line('产品ID=' || V_ID);
END;

2.2 第二种方式通过异常处理

beginselect x into v from t where ...<do something>
exception when no_data_found then<handle apppropriately>
end

所以上面的例子可以修改为下面的SQL

DECLAREV_ID NUMBER;
BEGINBEGINSELECT P.PRODUCTID_PKINTO V_IDFROM PRODUCTEN PWHERE P.PRODUCTNAMESTR = '国内共享套餐';exceptionwhen no_data_found thenV_ID := NULL;END;DBMS_OUTPUT.put_line('产品ID=' || V_ID);
END;--执行结果:PL/SQL procedure successfully completed

3. 针对此问题的思考

想想上面的两种处理方式让脚本很难看并且很笨拙,用SELECT INTO前先COUNT(*)检测,感觉浪费性能, 用Exception异常块来处理,程序脚本中可能就会有很多begin/exception/end块语句块看着很傻很笨拙, 很多人提出了为什么Oracle 不能改善ORA-01403,比如当查询不到数据的时候返回NULL 来替换‘no data found.’异常

仔细思考,先使用查询语句检查不仅会增加将开销,由于Oracle的语句读一致性,如果其他人在count(*)后删除了该行, 那么再执行select into 也可能得到no_data_found异常;所以使用count(*) 检查并不安全。

而在一个存储过程中有很多个select语句, 把这些语句又包装到begin/exception/end块中会很麻烦,更好的解决方法是

  • 编写更小的程序, 尽可能让代码在一个屏幕中
  • 通过将查询链接在一起减少查询语句

这是我从网上看到的一位国外的程序员对此问题的观点,原文如下

Absolutely best method is to handle exception what you are trying to avoid. This is safest, fastest, uses least resources and is most readable and uderstandable. If someone will look at your "SELECT min(x) INTO a" he will not puzzle out your intents, he will uderstand code exactly the way it is written. Do not teach your programmers bad things. It is lame what you want to do. Oracle do not need to change anythig about this one. NEVER! This is the way it should be.

And never say "exeption block takes extra lines of code".
It is absolutely dumbest argument I've ever heard.
You should judge programm by the way it woks, not by the count of lines.

我觉得他说的很有道理

  • 最安全最快最省资源的方式就是处理你方法上的异常,同时教别人也这样做,养成好习惯
  • 应该通过程序运行的方式来判断程序好坏而不是行数

前一篇:Oracle 如何MD5加密

ORA-01403未找到任何数据select into问题分析相关推荐

  1. oracle 为找到任何数据,oracle – SQL错误:ORA-01403:未找到任何数据

    当火更新查询时 update JISPBILCORBILLINGPRD501.TBLMACCOUNTADDRESS set Address1='NehateSir',stateid='STT0002' ...

  2. 更新数据时出错——所有记录中均未找到搜索关键字

    出错环境:windows server 2003 enterprise sp2+Access2000+iis6 出错情况:打开页面修改数据后保存时出现错误:所有记录中均未找到搜索关键字 出错原因:Mi ...

  3. ORA-02291: 违反完整约束条件 - 未找到父项关键字 解决方法

    使用oracle数据库时,出现**ORA-02291: 违反完整约束条件 **错误,自己通过百度找到一些做法.以下这个方法居多: 表A中有个字段是外键,关联了表B中的某字段,再往表A插入数据时,会出现 ...

  4. oracle11g 数据库导出报“ EXP-00003: 未找到段 (0,0) 的存储定义”错误的解决方案

    原文链接:http://edmzkj.blog.51cto.com/9115753/1433814 导出oracle11.2.0.2的服务器的数据时,报"EXP-00003: 未找到段 (0 ...

  5. oracle导出数据库中表出现导出报错(EXP-00003)未找到段 (0,0) 的存储定义

    前两天在使用oracle数据库,使用dba用户利用PL/SQL 中的tool中export table导出表结构时,出现了如下问题: 好多张表"报错(EXP-00003)未找到段 (0,0) ...

  6. ORA-02298: 无法验证 (约束) - 未找到父项关键字 解决办法

    --在用PL/SQL导入表数据的时候报错 ORA-02298: 无法验证 (PNET.POST_CLOB_FK) - 未找到父项关键字 --发现是启用外键约束时报的错 alter table DM_V ...

  7. oracle 添加外键,报“未找到父项关键字”

    添加外键约束时报"无法验证FK_ADMIN_PAGE_SUBMODULE,未找到父项关键字",  终于找到原因了.  主要看两表中的数据是否一致,从表中要关联外键的字段中的数据必须 ...

  8. ORA-00923: 未找到要求的 FROM 关键字

    oracle处理 后台数据时, select a.oga01 发货单号,e.imaud04 箱/套 from oga_file a left join ogb_file b on b.ogb01 = ...

  9. xsmax 拨号失败服务器无响应,加载资源失败:服务器响应状态为404(未找到)和nodejs...

    我试图在nodejs服务器上获取html元素数据.但是我一直在浏览器中收到很多错误.这是我的html页面.加载资源失败:服务器响应状态为404(未找到)和nodejs SimplyBPM | Cust ...

  10. oracle 存进去0的数据库,oracle11g 数据库导出报“ EXP-00003: 未找到段 (0,0) 的存储定义”错误的解决方案...

    导出oracle11.2.0.2的服务器的数据时,报"EXP-00003: 未找到段 (0,0) 的存储定义"错误.初步分析是由于数据表是空表导致该问题. Oracle 11G在用 ...

最新文章

  1. React 项目--引入bebal 解析JSX(5)
  2. Hello Android – 迈出android开发第一步
  3. 北航java大作业,北航成人继续教育 本科 计算机科学与技术 JAVA——大作业.doc
  4. Delphi:ADOConnection连接SQLServer自动断网问题解决
  5. linux命令添加文件权限,linux 的常用命令及文件权限管理
  6. mysql插入时间区间_mybatis插入数据时返回主键以及MySQL根据时间区间查询问题总结...
  7. 计算数字的出现次数 java_关于Java:如何计算数字在.txt文件中出现的次数
  8. 移动端UC /QQ 浏览器的部分私有Meta 属性
  9. 前端学习(2968):实现路由跳转的两种方式
  10. jhipster 配置 mysql_JHipster 基础使用
  11. CCF201712-3 Crontab(100分)【模拟+文本处理】
  12. delphi利用bing翻译API做的多国语言翻译软件
  13. 新手建站推广完美教程(重点推荐)
  14. 基于pytorch训练的VGG16神经网络模型完成手写数字的分割与识别
  15. 报表服务器url修改,配置报表服务器 URL
  16. 2020-11-10大众点评字体反爬抓取信息
  17. 体验说 | 快速谷歌浏览器翻译插件的菜单栏工具
  18. win10误删文件怎么恢复?
  19. 【引用】pygame菜鸟入门指南
  20. pandas 第二章 pandas基础

热门文章

  1. beyond compare如何设置只比较实际内容?(使用关联规则比较)
  2. 海思mpp_sample例子详解
  3. 基于BearPi套件开发的智能儿童手表系统
  4. 使用clonezilla(在生龙)克隆系统
  5. 删除右键新建多余菜单
  6. 转 Oracle 9i,10g,11g各自alert日志的位置
  7. wps怎么图片透明_wpsword如何设置图片透明度
  8. 胡侃学习(理论)计算机-From 南大小百合
  9. 即时热榜——月薪3W+自媒体人的必备神器
  10. 路网自动构建路段拓扑