PDA

View Full Version : SQLRPGLE



malzusrex
09-06-16, 11:10
Hallo Gemeinde!

Ich hätte da mal wieder eine Frage zu einem SQLRPGLE-Programm.

Im Programm habe ich im Moment mehrmals ein SQL, welches bis auf die letzte WHERE-Bedingung identisch ist.

Exec SQL
Select Wert1, Wert2, Wert3,.... into :XDatenSQL
from Myfile where Feld1 = :XDAT and Feld2 = :WASauchIMMER
and hier dann der abweichende Teil

Diese Anweisung kommt dann öfters.
Jetzt Wollte ich für die Lesbarkeit des Programms das SQL als String definieren
Anweisung_Alle = 'Select ...'
und dann
Anweisung_SQL = %Trim(Anweisung_ALLE) + abweichender Teil
Danach dann ein
Exec SQL
Execute Immediate :Anweisung_SQL;

Nur so funktioniert es wohl nicht, wie ich es mir gedacht habe.
Wie müsste es richtig aussehen ??

Viele Grüße
Ronald

ExAzubi
09-06-16, 11:22
SQLSTM 3064A VARYING
SQLSTM = 'SELECT FLD1, FLD2, ... FROM MyFILE
SQLSTM = SQLSTM + 'WHERE BED1 AND BED2..'

EXEC SQL PREPARE STMT1 FROM :SQLSTM
EXEC SQL DECLARE C1 CURSOR FOR STMT1
EXEC SQL OPEN C1
EXEC SQL FETCH INTO :VAR
EXEC SQL CLOSE C1


So funktioniert es bei mir V6R1 & V7R1 ...

Pikachu
09-06-16, 11:24
Läufst du da nicht in die Falle einer SQL-Injection (https://de.wikipedia.org/wiki/SQL-Injection)?

malzusrex
09-06-16, 11:31
OKay,

ich dachte ich kann mir den PREPARE, DECLARE,... Sparen

Dann werde ich das mal so machen

BenderD
09-06-16, 11:35
Läufst du da nicht in die Falle einer SQL-Injection (https://de.wikipedia.org/wiki/SQL-Injection)?

... ein vermeintlich schlauer Spruch, unpassend angebracht!!!
- solange der Rest des Statements nicht zugänglich ist, passiert da garnichts!!!
- die üblen Beispiele, die gerne für Injection angebracht werden, funktionieren mit DB2/400 nicht, da der prepare keine 2 Statements durchlässt!!!

D*B

PS: gegen Injection ist ein einfaches Kraut gewachsen, filtern des Eingabestrings.

dschroeder
09-06-16, 11:36
Mit select ... into :xDatenSQL ... nutzt du ja eine Host-Variable (xDatenSQL) innerhalb deiner SQL Anweisung. Das geht nur, wenn du eine "echte" SQL-Anweisung hast (also statisches SQL). Wenn du dynamisches SQL machst, hast du ja erstmal keine echte SQL-Anweisung mehr, sondern einen String, der später interpretiert wird. Da kann er die Hostvariablen dann nicht mehr erkennen. Deshalb ist der Cursor notwendig.