PL / SQL中的子查询返回NO_DATA_FOUND

时间:2013-11-07 15:28:38

标签: sql exception plsql subquery

我正在查看的PL / SQL查询在确定记录数时使用子查询:

SELECT COUNT(*)
INTO v_seqn
FROM SIPR.KDX KDX
WHERE KDX.KDX_STUC NOT IN ( SELECT ADD1.ADD_ADID
                            FROM SIPR.MEN_ADD ADD1
                            WHERE ADD1.ADD_ADID = KDX.KDX_STUC)
AND KDX.KDX_STUC = v_stud_id
AND KDX.KDX_SITS = 'A';

如果子查询没有返回任何记录,这是否会导致可以处理的NO_DATA_FOUND异常,或者它是否完全有效,并且只会为主查询的“NOT IN”子句返回null并导致计数为0

感谢。

2 个答案:

答案 0 :(得分:0)

这将从SIPR.KDX KDX获取所有行以及其他令人满意的条件 在where子句中,但子查询的互斥结果。这是 在集合语言中类似的A-B-C,其中A是你的表,B是你的子查询,C是 where子句中的所有其他令人满意的条件。

尝试使用外连接

SELECT
      COUNT ( * )
INTO
      V_SEQN
FROM
          (SELECT
                *
           FROM
                SIPR.KDX KDX
           WHERE
                KDX.KDX_STUC = V_STUD_ID
                AND KDX.KDX_SITS = 'A') TABLE1
      LEFT OUTER JOIN
          SIPR.MEN_ADD ADD1
      ON TABLE1.KDX_STUC = ADD1.ADD_ADID
WHERE
      ADD1.ADD_ADID IS NULL;

或使用不存在

SELECT
      COUNT ( * )
INTO
      V_SEQN
FROM
          (SELECT
                *
           FROM
                SIPR.KDX KDX
           WHERE
                KDX.KDX_STUC = V_STUD_ID
                AND KDX.KDX_SITS = 'A') TABLE1
  WHERE NOT EXISTS  
        (SELECT   
               1  
          FROM  
               SIPR.MEN_ADD ADD1  
          WHERE  
               TABLE1.KDX_STUC = ADD1.ADD_ADID)      

答案 1 :(得分:0)

您无需更改任何内容。如果子查询没有返回任何行,那么主查询将没有结果,但由于它是一个没有任何group byhaving clauses的计数查询,它将始终只返回一行只有一个值,这可能是是0

它永远不会返回null,也不会给你一个NO_DATA_FOUND异常。 NO_DATA_FOUND异常不是SQL,而是当您尝试select一个值into变量时发生的PL / SQL错误,但(主)选择不返回任何行。