ORA-01403:找不到Select into的数据

时间:2014-01-17 12:47:36

标签: oracle

我对以下查询收到ORA-01403: no data found异常。这个错误的可能性有多大?

SELECT trim(name)
  INTO fullname
  FROM ( SELECT n.name
         FROM directory dir, store n
        WHERE dir.name = n.name
          AND dir.status NOT IN ('F', 'L', 'M')
        ORDER BY n.imp, dir.date)
  WHERE rownum <= 1;

如何处理此错误?

4 个答案:

答案 0 :(得分:7)

虽然您已经放置了条件,但更好的方法是处理未找到记录的情况或“找不到数据”错误。我会在上面编写代码,用它包含自己的BEGIN / EXCEPTION / END块来包装SELECT语句。

代码可能是这样的:

 BEGIN
   SELECT trim(name) 
   INTO fullName
   FROM
     (SELECT n.name
     FROM directory dir,
        store n
     WHERE dir.name            = n.name
     AND dir.STATUS NOT                IN ('F','L','M')           
     ORDER BY n.imp,
        dir.date
     )
   WHERE rownum    <= 1;
 EXCEPTION
   WHEN NO_DATA_FOUND THEN
     fullName = NULL;
 END;

答案 1 :(得分:7)

如果Sandeep 描述的标准异常处理似乎有很多开销(就像在我的情况下一样)并且您使用{{1> 罚款或者某些&lt; not found&gt; ),您可能只是将其转换为:

NULL

=&GT;没有 ORA-01403 提出:

select  col  into  v_foo  from  bar  where 1=0  -- would provoke ORA-01403

答案 2 :(得分:1)

可能是因为您的查询

SELECT n.name
        FROM directory dir,
          store n
        WHERE dir.name            = n.name
        AND dir.STATUS NOT                IN ('F','L','M')           
        ORDER BY n.imp,
          dir.date

没有返回任何行

答案 3 :(得分:1)

如果dir.status表中有任何空值,那么not in可能没有按照您的想法执行。即使您认为应该获得一行或多行,也可能获得零行。您可以切换为and not (dir.status in ('F,'L','M'))而不是dir.status not in ('F','L','M')

请参阅this以供参考。