PL/SQL 中的子查询返回 NO_DATA_FOUND

Posted

技术标签:

【中文标题】PL/SQL 中的子查询返回 NO_DATA_FOUND【英文标题】:Subquery in PL/SQL returning NO_DATA_FOUND 【发布时间】:2013-11-07 15:28:38 【问题描述】:

我正在查看的 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 .

谢谢。

【问题讨论】:

你试过运行它吗?这种情况下不会抛出NO_DATA_FOUND异常,COUNT会返回0 不幸的是,我自己无法访问环境来测试它,我正在尝试帮助一位同事。遗憾的是,这里没有 PLSQL 专家,所以我呼吁 SO 方面的专家。 :-) 我明白了,在这种情况下,正如我所说,NO_DATA_FOUND 异常不会被抛出。如果您是SELECTing ... INTO 一些变量,并且该查询不会产生任何结果,那么您将得到NO_DATA_FOUND。在您的查询中,当子查询不返回任何行时,COUNT(*) 将返回 0 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

这将从 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)      

【讨论】:

以上是关于PL/SQL 中的子查询返回 NO_DATA_FOUND的主要内容,如果未能解决你的问题,请参考以下文章

从 PL/SQL 中的查询加硬编码变量返回用户定义的表

返回表查询的 PL/SQL 封装函数

从 PL/SQL 中的过程返回值数组

pl/sql 块中的子选择上的 Oracle 8i 动态 SQL 错误

无法从 cmd PL/SQL 中的简单查询中获得正确的结果

使用 PL/SQL 函数体返回 SQL 查询