PDA

View Full Version : Eingebettetes SQL im RPG



Seiten : [1] 2

Souljumper
04-08-09, 16:43
Hallo,

ich arbeite grad an einem RPG Programm das mit SQL-Cursorn arbeitet.

Nun bin ich an den Punkt gekommen, wo ich bei der Cursordeklaration einen substring-Befehl anwenden will, mit dynamischen Positionsnummer.

z.b.

select * from A where subst(feldA, :pos1, :pos2) = 'XXX'

Diese dynamische Positionsnummern "pos1" und "pos2" fliegen mir aber bei der Compilierung um die Ohren. Egal ob ich die Werte als nummerische Felder definiere oder als Alphanummerische Felder.

Geht das gar nicht biem Substr? oder mach ich was falsch?

BenderD
04-08-09, 16:54
pos1 und pos2 müssen zum Zeitpunkt des Prepare bekannt sein => das geht mit statischem SQL nicht, sondern nur mit dynamischem SQL, da kann man zur Laufzeit den Prepare machen.

D*B


Hallo,

ich arbeite grad an einem RPG Programm das mit SQL-Cursorn arbeitet.

Nun bin ich an den Punkt gekommen, wo ich bei der Cursordeklaration einen substring-Befehl anwenden will, mit dynamischen Positionsnummer.

z.b.

select * from A where subst(feldA, :pos1, :pos2) = 'XXX'

Diese dynamische Positionsnummern "pos1" und "pos2" fliegen mir aber bei der Compilierung um die Ohren. Egal ob ich die Werte als nummerische Felder definiere oder als Alphanummerische Felder.

Geht das gar nicht biem Substr? oder mach ich was falsch?

Souljumper
04-08-09, 17:19
wie geht dynamisches sql unter rpg?

wie müsste da so ein declare mit aufruf aussehen.

dynamisches sql kenn ich bisher nur von oracle, habs aber unter db2 und rpg nie verwendet.

ein kurzes syntaxbeispiel oder so wäre fein?

BenderD
04-08-09, 18:31
... da sollte es hier im Forum schon Beispiele geben - und wenn man sich die Mühe des suchens ersparen will, gibt es immer noch das FM...

D*B


wie geht dynamisches sql unter rpg?

wie müsste da so ein declare mit aufruf aussehen.

dynamisches sql kenn ich bisher nur von oracle, habs aber unter db2 und rpg nie verwendet.

ein kurzes syntaxbeispiel oder so wäre fein?

B.Hauser
04-08-09, 19:06
Hallo,

mit welchem Release arbeitest DU?
Ich habe gerade unter V5R4 ein Mini-Programm mit embedded SQL Cursor und Substring mit Host-Variablen in den Where-Bedinungen erstellt. Die Ausführung läuft ebenfalls problemlos.




D BegPos S 5I 0
D Len S 5I 0
D Text S 50A
/Free
BegPos = 3;
Len = 5;

Exec SQL Declare CsrC01 Cursor For
Select Name1F From MYTABLE
Where Substr(Name, :BegPos, :Len) = 'ABCDE';

Exec SQL Open CsrC01;
Dsply SQLCOD;
Exec SQL Fetch Next From CsrC01 into :Text;
Dsply SQLCOD;
Dsply Text;
Exec SQL Close CsrC01;
*INLR = *ON;
/End-Free


... übrigens in SQL heißt die scalare Funktion SUBSTR (und nicht SUBST, das ist RPG!)

Birgitta

Souljumper
05-08-09, 10:16
hab hier v5r1

mit free rpg arbeiten wir gar nicht, nur rpg 4.

muss ich beim dynamischen sql jedesmal den prepare und declare ausführen bevor ich einen open mache?

Mein programm wird nämlich von einem asy-job aufgerufen und bin mir jetzt nicht sicher warum ich andauernd die fehlercodes 514 kriege.

B.Hauser
05-08-09, 10:38
Das funktioniert mit klassischem RPG genauso.
Es funktioniert sogar mit RPGIII.

Hast Du mal versucht SUBSTR statt SUBST zu scheiben.

Beim dynamischen SQL wird der SQL-Befehl zur Laufzeit zusammengepfriemelt und dann in einen ausführbaren SQL-Befehl (geschieht beim PREPARE) konvertiert.

Deshalb: Prepare, Declare, Open ist immer erforderlich. Es sei den das gleiche SQL statement wird mehrfach ausgeführt, dann genügt ein OPEN.

Birgitta

Souljumper
05-08-09, 10:45
hm

hab mr jetzt mal ein minimal beispiel gebastelt, das funktioniert nur wenn ich in der reihenfolge

declare, prepare, open vorgehe

ich finde ein beispiel für prepare, declare, open auch auf den ibm seiten, aber die funktionieren bei mir nicht....

sqlcode 440 oder 514 sind da die regelmäßigen antworten.

Souljumper
05-08-09, 11:10
das problem scheint mein substringbefehl zu sein.

sobald ich in meinem vorbereiteten statement string ein

substr(feld1, 1, ?) = ?

einbaue, schlägt der prepare fehl.

ist die syntax bei substr anders?

Souljumper
05-08-09, 11:24
er kann es nicht, aus welchen gründen auch immer.

stmnt = 'substr(feld1, 1, ' + %trim(len) + ') = ?'

funktioniert -.-*