当前位置:首页 > 问答 > 正文

ORA-00000其实不是错,正常结束了但很多人还以为报错了怎么办远程帮你搞定

引用自知乎用户“码农的日常吐槽”和CSDN博客“老DBA手记”的相关讨论,以及部分技术社区网友的常见疑问)

ORA-00000其实不是错,正常结束了但很多人还以为报错了怎么办远程帮你搞定,这个事情说起来有点搞笑,但确实天天都在发生,很多刚接触Oracle数据库的朋友,或者甚至一些已经工作了一段时间的程序员,一看到程序日志里跳出个“ORA-xxxxx”的提示,神经立刻就紧绷起来了,下意识就觉得是数据库又出幺蛾子了,特别是这个ORA-00000,它可能是最冤的一个“错误代码”了。

你得先明白ORA是什么意思,ORA就是Oracle Error的缩写,后面跟着的五位数字是错误代码,ORA-60000系列的号码是用户自定义错误的保留范围,而00001到差不多两万之间的号码,是Oracle自己用的,这里面,大家最熟悉的就是ORA-00942表或视图不存在,或者ORA-01403未找到数据这些,错误代码的数字部分通常不是零,而且会伴随着具体的错误信息。

ORA-00000其实不是错,正常结束了但很多人还以为报错了怎么办远程帮你搞定

那么ORA-00000是什么呢?根据Oracle官方的文档,ORA-00000实际上代表的是“normal, successful completion”,翻译过来就是“正常,成功完成”,它根本不是一个错误,而是一个“成功”的标识,你可以把它理解成一个“OK”信号,就好像你问一个人“事情办好了吗?”,他回答“办好了,没问题”,这个ORA-00000就是那个“办好了,没问题”的回应。

那为什么会出现这种情况,让大家误会呢?主要有以下几个场景:

第一,也是最常见的,就是在写PL/SQL代码的时候,比如你写了一个存储过程或者函数,在代码的最后,你写了一句 RAISE NO_DATA_FOUND; 或者其他的异常处理,如果你的代码执行过程中一切正常,没有触发任何异常,那么当程序执行到结尾的时候,Oracle为了告诉调用者“我这个程序块已经正常执行完毕了,没有抛出任何你预料中的异常”,它有时(取决于客户端工具和调用方式)就会返回一个ORA-00000的消息,这就好比说,“报告长官,任务完成,途中未遇敌情”,但新手一看,ORA开头!立马就慌了,开始到处查00000是啥意思。

ORA-00000其实不是错,正常结束了但很多人还以为报错了怎么办远程帮你搞定

第二,是一些数据库管理工具或者监控脚本的设计问题,有些工具在捕获数据库执行的返回状态时,会把所有以ORA-开头的信息都归类为“错误”级别(Error Level)的日志,它们可能没有特意去区分ORA-00000和其他真正的错误代码,在你看来,工具的红灯亮了,错误日志里记录了一条ORA-00000,你当然会觉得是报错了。

第三,是程序中的异常捕获逻辑写得太宽泛,比如有的程序员会写 EXCEPTION WHEN OTHERS THEN…,这个OTHERS会捕获所有未被前面特定异常捕获的错误,其中就包括了ORA-00000,如果你在这种捕获块里写了日志记录,把SQLERRM(错误信息)记录下来,那么本来正常的流程也会被记录成“ORA-00000: normal, successful completion”,看起来就很奇怪,污染了真正的错误日志。

那怎么判断和解决这个“乌龙”呢?远程帮你搞定的思路其实很简单,你自己就能做:

ORA-00000其实不是错,正常结束了但很多人还以为报错了怎么办远程帮你搞定

  1. 看完整信息:不要光看一个错误代码ORA-00000就下结论,一定要看它后面跟着的完整文本,如果是“normal, successful completion”,那就把心放回肚子里,这说明你的操作成功了,这就像你收到一封邮件标题是“紧急通知”,点开一看内容是“通知您本月工资已正常发放”一样。

  2. 检查你的代码逻辑:如果你的存储过程或函数最后没有必要地使用了RAISE语句,可以考虑是否真的需要,有时候是为了调试,但上线后应该移除或妥善处理。

  3. 审查日志记录设置:检查你的应用程序或者监控脚本,看看是不是把日志级别设置得太“敏感”了,可以修改一下逻辑,当捕获到的错误代码是00000时,不将其作为错误记录,或者记录为INFO(信息)级别,而不是ERROR(错误)级别。

  4. 理解上下文:结合你执行的操作来判断,如果你刚执行了一条INSERT语句,然后看到了ORA-00000,同时数据也确实插入成功了,那就不用管它。

说白了,解决这个问题的关键就是“认知”的改变,一旦你知道了ORA-00000是个“好人”,是个“成功信号”,下次再看到它,你非但不会紧张,反而会感到安心,这就像你习惯了看交通灯,红灯停绿灯行,突然有一天你到了一个地方,它的“通行”信号是个蓝色灯,你一开始可能会懵,但一旦知道蓝灯就等于绿灯,你就再也不会害怕了,ORA-00000就是那个在Oracle世界里的“蓝色通行灯”,以后再在日志里看到它,记得对它说声谢谢,因为它意味着你的数据库操作一帆风顺。