PDA

View Full Version : Einfache Abfrage in COBOL/400 mit EXEC SQL



AS400-Anfänger
27-06-06, 09:52
Hallo,
ich habe bisher keinerlei Erfahrungen in embedded SQL sammeln können, die IBM "Hand-" Bücher sind auch nicht wirklich hilfreich. Ich bräuchte die Kombination eines
SELECT DISTINCT feld1 FROM db

und die gleichzeitige Ausgabe der Anzahl Vorkommen dieses Feldes (SELECT COUNT(*)).

Auf unserer Entwicklungsmaschine ist SQL installiert, aber auf unserem Produktivsystem leider nicht und mit einem QRY kriege ich ja kein DISTINCT hin, bleibt also nur ein COBOL400-Programm, in dem ich aber gerne die Annehmlichkeiten der SQL nutzen würde ;)

B.Hauser
27-06-06, 10:18
Hallo,

hast Du es schon mal so versucht:



Select Field, Count(*)
From MyTable
Group By Field


Birgitta

AS400-Anfänger
27-06-06, 12:00
Prima, das funktioniert super! Also ist der DISTINCT gar nicht nötig, sollte ich vielleicht mal meine SQL-Kenntnisse auffrischen / erweitern.

Falls es noch mehr Anfänger wie mich gibt, so habe ich es gelöst:



...
EXEC SQL
DECLARE C1 CURSOR FOR
SELECT SUAUSBKZ, COUNT(*)
FROM SUSTAM
GROUP BY SUAUSBKZ
END-EXEC.
*
EXEC SQL
OPEN C1
END-EXEC.
*
PERFORM FETCH-ROW UNTIL SQLCODE NOT = 0.
*
EXEC SQL
CLOSE C1
END-EXEC.
...
EXEC SQL
FETCH C1 INTO :AUSBKZ, :ANZAHL
END-EXEC.



Ein kosmetisches Problem bleibt aber noch: Die letzte Zeile wird 2 x ausgegeben?

Fuerchau
27-06-06, 12:11
Wenn nach dem Fetch der SQLCODE <> 0 ist, darfst du den Inhalt halt nicht mehr ausgeben, die letzten Feldinhalte bleiben dann nämlich erhalten.

B.Hauser
27-06-06, 12:19
Für Anfänger und Fortgeschrittene:

Nicht auf SQLCODE = 0 abfragen!:
Es gibt Situationen, in denen ein positiver SQLCODE (zwischen 1 und 99) ausgegeben wird. Dies ist nur eine Warnung, der Datensatz wird dennoch zurückgebracht und kann verarbeitet werden.
(Diese Erweiterung ist in Release V5R1 erfolgt und bei unseren Abfragen z.T. für falsche Ergebnisse gesorgt!)

Deshalb sollte man explizit auf SQLCODE 100 (oder SQLSTATE '02000') für Last Record oder Nicht gefunden abfragen.
Ausserdem sollte man Fehlersituationen (Negativer SQLCODE oder SQLSTATE bei dem die ersten beiden Stellen weder '00', noch '01', noch '02' sind), prüfen und evt. entsprechend darauf reagieren.

Birgitta

AS400-Anfänger
27-06-06, 13:01
Aha, da habe ich heute eine Menge gelernt. Mein Wissen bezüglich embedded SQL tendiert wie schon o.a. gegen Null.

Dann sind die über SQLCA implizit eingebundenen Felder SQLCODE und SQLSTATE so etwas wie der FILE-STATUS im COBOL. Werde mal bei den IBM-Redbooks nachschauen, ob es da eine Aufschlüsselung gibt.

In obigem Code stehen beide Felder immer auf 0, außer nach dem DECLARE (SQLCODE = 1077952576) und wie schon von Fuerchau vorausgesagt nach dem letzten FETCH (SQLCODE = 0000000100, SQLSTATE = '02000').

Nochmals vielen Dank euch Beiden, ihr habt mir sehr geholfen!

Fuerchau
27-06-06, 13:18
Der Declare führt kein SQL aus, daher ist die Variable SQLCODE und SQLSTATE nicht initialisiert, was da drin steht ist zu diesem Zeitpunkt Schrott.