ORA-01422:精确提取返回超过请求的行数

时间:2016-07-25 15:42:04

标签: oracle plsql

坚持这个错误...

DECLARE
 AVGRUNTIME                            number(10,0);
 PERFCATEGORYRANGELOCOUNT              number(10,0);
 PERFCATEGORYRANGEHICOUNT              number(10,0);
 DW_LOW                                number(10,0);
 DW_HI                                 number(10,0);     

CURSOR LC_ABC IS

select distinct(ap.dwprocessid) 
from auditprocess ap, dwprocess d
where ap.dwprocessid = d.dwprocessid
and ap.insertts > sysdate - 61
and dwprocessmonitorind = 'Y';

BEGIN

FOR REC IN LC_ABC
LOOP

select ((ap.LASTUPDATETS - INSERTTS)*24*60*60) as AVGRUNTIME,
(.1 * ((ap.LASTUPDATETS - INSERTTS)))as PERFCATEGORYRANGELOCOUNT ,
(1.9 * ((ap.LASTUPDATETS - INSERTTS)))as PERFCATEGORYRANGEHICOUNT
INTO AVGRUNTIME, PERFCATEGORYRANGELOCOUNT, PERFCATEGORYRANGEHICOUNT
from auditprocess ap
where ap.dwprocessid = rec.dwprocessid 
and insertts > sysdate - 61
group by (ap.LASTUPDATETS - INSERTTS);
第1行的

[错误] [1] ORA-01422:精确提取返回超过请求的行数 ORA-06512:第27行

2 个答案:

答案 0 :(得分:1)

您按ap.LASTUPDATETS - INSERTTS进行分组,如果您有2个不同的值,则错误将会增加,因为您无法在变量中插入2行。 也许你不应该按照这些列进行分组,并在select子句中使用聚合函数,如:

select avg((ap.LASTUPDATETS - INSERTTS)*24*60*60) as AVGRUNTIME,
       min(.1 * ((ap.LASTUPDATETS - INSERTTS)))as PERFCATEGORYRANGELOCOUNT ,
       max(1.9 * ((ap.LASTUPDATETS - INSERTTS)))as PERFCATEGORYRANGEHICOUNT
INTO AVGRUNTIME, PERFCATEGORYRANGELOCOUNT, PERFCATEGORYRANGEHICOUNT
from auditprocess ap
where ap.dwprocessid = rec.dwprocessid 
and insertts > sysdate - 61;

答案 1 :(得分:0)

这正是错误所说的。您的SELECT ... INTO返回多行。

CURSOR LC_ABC包含一个DISTINCT - 这意味着您已经知道dwProcessId可能在表auditProcess中出现多次。

然后使用完全相同的逻辑从表中再次选择 - 这将返回所有匹配的行。

然后使用lastUpdateTS - insertTs的值进行聚合。因此,每个dwProcessId返回一行(lastUpdateTS - insertTs)