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 by
或having clauses
的计数查询,它总是会返回正好有一个值的一行,这可能是0
.
它永远不会返回 null,也不会给你一个 NO_DATA_FOUND 异常。 NO_DATA_FOUND 异常不是 SQL,而是当您尝试 select
值 into
变量时发生的 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的主要内容,如果未能解决你的问题,请参考以下文章