PDA

View Full Version : Select sum() into :VAR SQLCODE 811



RoRa
24-08-12, 11:01
Hallo Zusammen,

ich habe in einen RPG-Programm eine embedded SQL-Anweisung geschrieben mit Select sum ( a+ b ) into :VAR1 where .....

als SQL-Code erhalte ich die -811

starte ich die Abfrage im Navigator erhalte ich ohne Probleme die Summe als Ergebnis

Wer hat eine Antwort auf dieses Problem?

Vielen Dank

mk
24-08-12, 11:08
Hallo,

da scheint im SQL etwas mit der where Bedingung nicht zu stimmen.

Nachrichten-ID . . . . . . . : SQL0811
Nachrichtendatei . . . . . . : QSQLMSG
Bibliothek . . . . . . . . : QSYS

Nachricht . . . : Ergebnis der Anweisung enthält mehr als eine Zeile.
Ursache . . . . : Die Ergebnistabelle einer Anweisung SELECT INTO, einer
Unterabfrage oder einer Unterauswahl einer Anweisung SET enthält mehr als
eine Zeile. Es handelt sich um Fehlerart &1. Bei Fehlerart 1 wurde von einer
Anweisung SELECT INTO versucht, mehr als eine Zeile zurückzugeben. Bei
Fehlerart 2 wurde durch eine Unterauswahl eines Basisprädikats mehr als eine
Zeile erstellt. Es ist nur eine Zeile zulässig.
Fehlerbeseitigung: Die Auswahl so ändern, dass nur eine Ergebniszeile
zurückgegeben wird, und die Anforderung wiederholen. Zur Verarbeitung
mehrerer Ergebniszeilen müssen die Anweisungen DECLARE CURSOR, OPEN und
FETCH verwendet werden. Für eine Unterabfrage können die Prädikate IN,
EXISTS, ANY und ALL verwendet werden, um mehrere Ergebniszeilen zu
verarbeiten. Wenn eine einzige Zeile erwartet wird, können Datenfehler, wie
z. B. doppelte Zeilen, auftreten, die die Rückgabe mehrerer Zeilen bewirken.

Guß
Michael

RoRa
24-08-12, 11:20
Hallo Michael,

an die Where Bedingung kann es eigentlich nicht liegen. Wenn ich das SQL-Statement im Dialog ohne into Aufrufe erhalte ich das korrekte Ergebnis angezeigt. Oder verhält sich Select sum() into :var1 where ... anders.

Gruss

RoRa

meini
24-08-12, 11:35
Bei der SUM-Funktion ist es möglich, dass das Ergebnis ein NULL-Wert ist, deshalb muss entweder in der Abfrage sichergestellt werden, dass kein NULL zurückgegeben wird (bspw. NULL duch den Wert 0 ersetzen)

SELECT coalesce(sum(...), 0) INTO :var1 FROM ...

oder es muss eine Indikatorvariable angelegt werden (5I 0) und folgendermaßen angegeben werden:

SELECT sum(...) INTO :var1 :indicator1 FROM ...
in indicator1 steht dann der Wert 1 wenn bei der SUM-Funktion NULL zurückgegeben wurde, sonst 0

Gruss
Klaus

mk
24-08-12, 12:17
Hallo,

wenn der SQLCode 811 angezeigt wird,
dann ist mehr als eine Ergebniszeile im Spiel.

Auf jeden Fall nochmal prüfen.
( Bibliotheksliste ? )
Gruß
Michael

B.Hauser
24-08-12, 16:55
Ohne das SQL Select ... into - Statement wirklich zu sehen, können wir uns hier nur etwas zusammenraten.

Wie Michael schon sagte SQLCODE -811 besagt, dass mehr als 1 Datensatz ausgegeben wurde.

Mehrere Datensätze werden bei der Verwendung von Aggregat-Funktionen nur dann ausgegeben, wenn in dem SQL Statement eine Group By-Anweisung angegeben wurde.

Das folgende Beispiel bringt nur einen Datensatz zurück:


Select Sum(Wert)
From Umsatz
Where KundeNr = '4711';

Ebenso das nächste SQL Statement:

Select Sum(Wert)
From Umsatz
Where KundeNr = '4711'
Group By KundeNr;

Das nächste Statement bringt mehrere Datensätze (einen für jeden Kunden der ArtikelNr '12345' geordert hatte) zurück:

Select Sum(Wert)
From Umsatz
Where ArtikelNr = '12345'
Group By KundeNr;

Sofern es nicht die Group By-Anweisung ist, ist alles weitere ohne das SQL-Statement zu kennen nur Spekulation.

Birgitta