日期:2014-05-17  浏览次数:20862 次

select数据into时出现ORA-01403数据不存在,但又不想事先select count(*),因为表里数据太多,这样会影响效率,请高手指教
在一个存储过程中

.....
select pno into p_pno from tableName where 条件;
if SQL%NOTFOUND then
  .... -- 进行后续相关操作
else
  .... -- 进行后续相关操作
end if

本意是直接select数据到变量,如果没找到,进行相应的后续insert操作,如果找到进行后续的相关update操作,
表tableName中记录比较多,后面的条件是根据表的唯一索引来的,只能select出一条数据,因此无需用游标。

每次遇到数据不存在,oracle都会出现ORA-01403:未找到数据的异常,按大家通常的解决办法是先select count(*)后根据count来进行判断,但问题是如果count>0后面还要重新select相应数据,对数据量大影响整个程序效率,有哪位高手能帮忙想出一次性select法吗?

------解决方案--------------------
ORA-01403:未找到数据的异常 是因为你select pno into p_pno from tableName where 条件
这样的查询将结果into变量,如果未查询出数据,在oracle中会有no_data_found这样的内部异常抛出

要实现你这样的需求,如杨哥所说,改成对变量p_pno的判断,也可以采用捕获异常形式:
SQL code

.....
begin
    select pno into p_pno from tableName where 条件;
    --找到数据,则不抛异常,进行后续的相关update操作

exception when no_data_found then
   --没找到,进行相应的后续insert操作
end;
.....

------解决方案--------------------
每一个用一个块来处理就是了啊,即:begin...exception when....end;....
------解决方案--------------------
用exception吧.这个是最保险的.对于没有数据和太多数据的情况都适用.