View Full Version : dynamisches SQL
Hallo Wissende,
mit embedded SQL im RPG möchte ich aus dem Artikelstamm Artikel abgreifen, die in einer anderen Datei nicht enthalten sind. Nun ist diese zweite Datei aber jeweils in Kalenderjahre aufgespalten. Ab dem Jahr 2000 hab ich somit 9 Dateien. Mit dyn. SQL hab ich es versucht um mit einer Schleife die Dateinamen variabel einzubinden.
Damit überschreite ich allerdings die max. Länge von 1024 für die Variable beim PREPARE.
Wie kann ich diese Begrenzung umgehen?
- mit einer view z.B.
ich würde aber erst mal darüber nachdenken ob dieses Design angemessen ist!!!
D*B
Hallo Wissende,
mit embedded SQL im RPG möchte ich aus dem Artikelstamm Artikel abgreifen, die in einer anderen Datei nicht enthalten sind. Nun ist diese zweite Datei aber jeweils in Kalenderjahre aufgespalten. Ab dem Jahr 2000 hab ich somit 9 Dateien. Mit dyn. SQL hab ich es versucht um mit einer Schleife die Dateinamen variabel einzubinden.
Damit überschreite ich allerdings die max. Länge von 1024 für die Variable beim PREPARE.
Wie kann ich diese Begrenzung umgehen?
Die max. Länge eines SQL's ist 32760 !
Du kannst also die Variable entsprechend lang gestalten.
Ich würde aber auch Dieter folgen und eine View über diese 9 Dateien (spater 10, 11, usw) legen:
create view myview
(select .... from jahr1
union all
select ... from jahr2
union all
select ... from jahr3
:
:
)
Dann kannst du mit dieser View joinen und wenn dann weitere Jahre dazukommen, brauchst du nur die View zu ändern.
Hallo,
zunächst 2 Fragen:
1. Welches RPG verwendest Du RPGIII oder RPGIV? (Wobei, wenn ich mich recht erinnere die Grenze bei RPGIII bei 256 Zeichen lag)
2. Unter welchem Release arbeitest Du?
Eigentlich müsste in den letzten Releasen ein String von 32.740 Byte Länge im Prepare-Statement verarbeitet werden können. Prüfe sicherheitshalber, ob Deine Variable nicht nur auf 1024 Zeichen begrenzt ist.
Sollte das nicht helfen ist, müsste ich das Statement sehen, um feststellen zu können, ob es vereinfacht werden kann.
Ansonsten kann man versuchen eine View anzulegen, in der alle Dateien verknüpft werden und diese dann im embedded SQL verwenden (ist so wie so die elegantere Lösung)
Ansonsten könnte noch eine Hilfsdatei generiert werden und mit den entsprechenden Sätzen gefüllt werden.
Oder das SQL-Statement wird in mehrere SQL-Statements gesplittet und das Ergebnis in einer Feldgruppe (oder Array-Datenstruktur) gespeichert und dann weiterverarbeitet.
Birgitta
@View: ich habe da weniger an eine union view gedacht, die läuft unter DB2/400 meist sehr bescheiden. Mit Views kriegt man die meisten Statements stark vereinfacht (dazu sind diese Dinger nämlich unter anderem da!!!) und damit auch verkürzt.
@temporäre Datei: das macht den Huddel noch größer!
@elegant: diese Daten gehören eigentlich in eine Datei mit einem Feld Jahr (or whatever) und unter einige hunder Millionen Sätzen gibt es keinen Grund das nicht zu tun. Damit eventuell vorhandene Programme, die diesen Huddel mit Jahresdateien verarbeiten keinen Schnupfen kriegen, stellt man auf diese Datei dann n Views, die jeweils ein Jahr rausziehen und so wie bisher heißen.
D*B
Danke erstmal für alle Bemühungen.
Mit der View habt Ihr natürlich Recht. Aber wie Hr. Bender bereits anmerkte, gibts natürlich jede Menge Altprogramme und da ran zu gehen ......
Mein Programm soll ein Reorg werden. Die Performance ist nicht ausschlaggebend. Ich arbeite im Free-RPG unter V5.4. Die Variable kann ich beliebig groß definieren. Der Compiler akzeptiert mehr als 2000Byte. Der Debugger zeigt dann aber nur 1024. Ist hier etwas einstellbar?
Wenn du den STRDBG verwendest, dann einfach "eval myvar : c <länge>"
Der strdbg wie auch der Debugger von RDi zeigen 1024 Byte.
Ob im strdbg eval myvar oder eval myvar : c erscheint das gleiche Ergebnis.
Das Lineal endet bei 1024. Es scheint der Compiler hier zu kappen.
Anweisung:
D ARTIKLselect S 2400A Varying
Versuch's mal im Debugger mit einem Substring:
Eval %Substr(MyVAr 1025 100)
Birgitta
eval ARTIKLselect : c 2400