0

假设我有一个包含、和abc列的表。仅当特定值有多行时,我才想从该表中获取数据(表中对于我要忽略的每个“垃圾”数据都有一行)。如何构造我的查询,以便我可以确定 a 是否有多行而不从游标中获取数据。p_idu_idcommentsp_idp_idp_id

目前,我的代码看起来像这样

Declare
  Cursor pqr is 
  Select p_id,u_id,comments from abc where p_id=123;
Begin

--I want to ignore the results if this query returns 0 or 1 row.
--I only want to process the data if this query returns multiple rows

End;
4

2 回答 2

2

您可以在查询中添加分析COUNT,以便结果集中的行数在您从游标中获取的每一行中都可用

Declare
  Cursor pqr is 
   select p_id,u_id,comments
     from (Select p_id,u_id,comments,count(*) over () cnt
             from abc 
            where p_id=123)
    where cnt > 1;
Begin

但是,如果有的话,可能不会给您带来太多的性能。您正在强制 Oracle 实现整个结果集,以便计算可能会使代码变慢的行数。您还在结果集中的每一行中添加另一列,这将增加内存使用量。而且您仍然必须获取第一行才能访问该CNT列。

您要解决的业务问题是什么,需要在获取所有行之前知道要获取多少行?这不是通常需要的东西,所以也许有更好的方法来解决您面临的任何问题。

于 2012-01-18T18:13:19.177 回答
1

试试这个。它使第一列成为计数,因此执行它,获取第一行。第 1 列将包含您需要的数字。

WITH 
BASE AS
(
    SELECT SOME_STUFF
    FROM SOME_TABLE
    WHERE SOME_CONDITION
)
SELECT (SELECT COUNT(*) FROM BASE),
       BASE.*
FROM BASE
于 2012-01-18T18:33:08.277 回答