【问题标题】:ORA-01403: no data found for Select intoORA-01403: 没有找到 Select into 的数据
【发布时间】:2014-02-06 19:31:44
【问题描述】:

我收到以下查询的 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;

我该如何处理这个错误?

【问题讨论】:

  • ORA-01403:当您 SELECT INTO 时未找到任何数据且未返回任何行。
  • 您告诉我们.. 您是否检查了 STATUS NOT IN ('F','L','M') 目录中的数据?您是否检查了存储中的数据以获取从目录中获取的名称?
  • 是的...我已经检查了这两个值。获取至少一个值。
  • 似乎有一个 bug,至少在我们的 Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit 环境中有它!:function bar return varchar2 as x dual%rowtype; begin select * into x from dual where 1=0; return 'test'; end; 通常没有返回一个错误并且不返回任何结果 :-/ .. 刚刚提到是因为 捕获 NO_DATA_FOUND 在这里明确有效 正如 Sandeeps 回答中提到的那样:stackoverflow.com/a/21186642/1915920

标签: oracle


【解决方案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

没有返回任何行

【讨论】:

    【解决方案2】:

    虽然您设置了 WHERE 条件,但更好的方法是处理未找到记录或“未找到数据”错误的情况。我会编写上面的代码,用它自己的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;
    

    【讨论】:

    • 这种情况下怎么写?
    • 尝试在评论中发布答案,但作为评论发布时它会失去缩进。因此在我上面的答案中添加了代码 sn-p。
    • 谢谢。如果我们没有将fullName = NULL; 放在异常块中会怎样?
    • 那只是一个占位符。您可以根据自己的逻辑处理此错误。
    【解决方案3】:

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

    参考this。

    【讨论】:

      【解决方案4】:

      如果 Sandeep 描述的标准异常处理 似乎开销很大(就像我的情况一样)并且您可以使用NULL 或一些单个 值),您可以像这样转换它:

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

      => 没有 ORA-01403 引发:

      -- if NULL would be fine:
      
      select  (select  col  from  bar  where 1=0)  into  v_foo  from dual
      
      -- if individual "NOT_FOUND" value should be set to avoid standard exception handling:
      --    (it depends on your col type, so it could e.g. be 'NOT_FOUND' or -1 
      --     or to_date( 'yyyy-mm-dd', '2100-01-01') )
      
      select  nvl(  (select  col  from  bar  where 1=0),  'NOT_FOUND'  )  into  v_foo  from dual
      

      【讨论】:

        猜你喜欢
        • 2015-12-31
        • 2014-03-28
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-27
        • 2011-11-06
        相关资源
        最近更新 更多