2016-07-25 6 views
0

mit diesem Fehler stecken ...ORA-01422: genaue Rückkehr holen mehr als die angeforderte Anzahl von Zeilen

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); 

[Fehler] [1] in Zeile 1 ORA-01422: genaue holen gibt mehr als angefordert Anzahl der Zeilen ORA-06512: bei Zeile 27

+1

Die Fehlermeldung scheint ziemlich klar zu sein - Ihre Abfrage zu 'auditprocess' gibt mehr als eine Zeile zurück, aber Sie versuchen, die Zeilenwerte in einzelne Zeilen einzugeben. bewertete Variablen. Zusätzlich: Sie wählen aus 'ap', aber in der WHERE-Klausel verweisen Sie auch auf 'rec'. Dies sollte Ihnen einen Fehler vor dem zeigen, den Sie zeigten; Also ... bist du sicher, was du gepostet hast, ist dein EXACT-Code? Ich neige dazu, es nicht zu glauben. – mathguy

+0

@mathguy rec ist der Datensatz vom Cursor in der for-Schleife. Er muss Alias ​​für distinct() als dwprocessid setzen. Für den anderen hast du recht. – Mottor

+0

@mathguy rec ist vom Cursor – vercelli

Antwort

1

Sie gruppieren sich nach ap.LASTUPDATETS - INSERTTS und wenn Sie 2 verschiedene Werte haben, wird ein Fehler auftreten, da Sie nicht 2 Zeilen in eine Variable einfügen können. Vielleicht sollten Sie nicht Gruppe von diesen Spalten und eine Aggregationsfunktion auf der select-Klausel wie verwenden:

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; 
0

Es ist genau das, was der Fehler sagt. Ihr SELECT ... INTO gibt mehr als eine Zeile zurück.

CURSOR LC_ABC enthält eine DISTINCT - dies bedeutet, dass Sie bereits wissen, dass dwProcessId mehr als einmal in Tabelle AuditProcess auftreten kann.

Dann wählen Sie erneut aus der Tabelle mit der exakt gleichen Logik - das wird alle übereinstimmenden Zeilen zurückgeben.

Sie aggregieren dann mit dem Wert von lastUpdateTS - insertTs. Sie geben daher eine Zeile pro dwProcessId pro Wert zurück (lastUpdateTS - insertTs)

Verwandte Themen