PDA

View Full Version : Dynamisches SQL bauen in RPG



labm
06-05-15, 10:57
Ich habe vor im SQLRPGLE -Embedded-SQL Dynamisch das SQL-zu bauen.
Probleme die ich dabei habe:
- es ist eine Große Menge an Daten. (Select *) und alle Felder in eine Dateibeschriebene Datenstruktur läuft nur langsam
-ich möchte nur bestimmte Felder auswählen und die entsprechend mit Fetch into dann verarbeiten (Fetch verlangt aber Varieblen oder DS) die ich aber nicht gleich kenne(von Benutzer auswählbar)

-beim Gruppierung möchte ich noch innerhab der Gruppen sortieren

Hat jemand eine Idee.
Danke

Fuerchau
06-05-15, 12:12
So dynamisch ist RPGLE leider nicht.
Du kannst per Describe Statement dir eine SQLDA übergeben lassen.
An Hand der SQL-Typen (laut SQLDA) setzt du dann Pointer in die SQLDA für die Felder deiner DS.
Beim Fetch nutzt du dann USING SQLDA MYSQLDA.
Alles leider etwas mühsam.

labm
06-05-15, 12:40
Danke für Antwort.
Wenn es einfach wäre hätte ich nicht gefragt.
Haben Sie vielleicht Beispiele. Habe damit noch nie gearbeitet.
Wenn ich gruppierung, summen usw. will, muss ich wahrscheinlich dieses so machen.
nochmals Danke
Gruß

BenderD
06-05-15, 13:05
... die Anzahl der Felder ist nicht das, was die Zeit verbraucht, das liegt eher an der Sortierung (falls da kein Index da ist), oder an Auswahlkriterien.

D*B

labm
06-05-15, 13:41
Wie kriege ich es erst dynamisch mit dem Feldauswahl und dem Gruppierung.
ist es so richtig:???

FETCH C1 USING DESCRIPTOR :SQLDA ;


D* SQL Descriptor area
D SQLDA DS
D SQLDAID 1 8A
D SQLDABC 9 12B 0
D SQLN 13 14B 0
D SQLD 15 16B 0
D SQL_VAR 80A DIM(SQL_NUM)
D 17 18B 0
D 19 20B 0
D 21 32A
D 33 48*
D 49 64*
D 65 66B 0
D 67 96A
D*
DSQLVAR DS
D SQLTYPE 1 2B 0
D SQLLEN 3 4B 0
D SQLRES 5 16A
D SQLDATA 17 32*
D SQLIND 33 48*
D SQLNAMELEN 49 50B 0
D SQLNAME 51 80A
D* End of SQLDA
D*
beim Wandeln fehler: SQL_NUM und SQL_Var nicht definiert sind???


Danke

ExAzubi
06-05-15, 16:46
Beim zusammenbauen des SELECT kann man auch Felder die wefallen durhc konstanten ersetzen!

SELECT NAME, KUNDENNR, SUM(UMSATZ), SUM(MENGE) FROM FILE ORDER BY NAME GROUP BY NAME, KUNDENNR

Kann man auch alternativ
SELECT NAME, ' ', SUM(UMSATZ), 0 FROm FILE ORDER BY NAME GROUP BY NAME

Somit kann die Ziel-DS gleichbleiben, man muss nur wissen wo was drin steht....

Nicht schön aber flexibel...

BenderD
06-05-15, 17:20
... bringt aber NullKommaNix, da der Satz ohnehin komplett gelesen wird, die Konstanten von der Datenbank ins Programm geliefert und dann gemapped werden. Das isr aber so oder so nur Arbeitsbeschaffung für den Programmierer...

D*B

B.Hauser
07-05-15, 02:40
SQL_NUM muss als Integer-Feld definiert und mit der maximal zu erwartenden Anzahl an Spalten inititalisiert werden.

Für jedes zurückgegebene Feld bzw. jede ausgewählte Spalte wird ein Element in der SQLVAR Feldgruppe/Datenstruktur gefüllt. In SQLTYPE wird der numerische Datentyp der Spalte (Beschreibung in SQL Reference in Appendix D), in SQLLEN die Datenlänge und in SQLDATA wird ein Pointer auf die Spalten-Daten ausgegeben. Diese Informationen musst Du dann verarbeiten.

Birgitta

Fuerchau
07-05-15, 07:55
Wobei der Pointer selber, z.B. mittels %adr() oder %alloc(), gesetzt werden muss.
Per Describe Statement übergibt man eine SQLDA-Struktur mit genügend Anzahl Elementen, anschließend kann man dann die Pointer setzen.