View Full Version : SQL UPDATE mit Hostvariablen (Wie geht das?)
Hallo,
vielleicht kann mir jemand von euch weiterhelfen.
Ich hätte eigentlich vor, mir in einem String (siehe unten) das Update-Statement zusammen zu stellen, da sich die WHERE-Bedingung ändern kann. Aber aufgrund der im String enthaltenen Hostvariablen scheint das Ganze nicht zu funktionieren.
Wie kann ich das Update-Statement ausführen?
exec sql execute immediate :sqlstmt; funktioniert nicht.
SQLSTMT = 'UPDATE Datei set Wert1 = :Hostvar1, Wert2 = :Hostvar2 where ....';
Danke für eure
Hilfe!
Joe
Hallo,
Du musst die Hostvariablen im String einbinden (alphanumerische Variablen müssen in Hochkomata gesetzt werden):
/Free
MySQLStm = 'Update MyTable
Set MyFld1 = ' + HostVar1 + ' +
MyFld2 = ''' + HostVar2 + ''' +
Where ... ';
Exec SQL Execute Immediate MySQLStm;
/End-Free
Birgitta
Nun ja, effektiver wenn nicht dynamisch wäre eigentlich:
c/exec sql
c+ UPDATE Datei
c+ set Wert1 = :Hostvar1, Wert2 = :Hostvar2
c+ where key = :mykey
c/end-exec
Hallo,
ich werde vorerst die von B.Hauser beschriebene Variante implementieren, allerdings würde mir die direkte Nutzung der Hostvariablen auch besser gefallen.
Kann man dies über das Einbinden der SQLDA ev. lösen?
Wo gibt es dazu gut beschriebene Beispiele?
Danke!
Joe
Hallo,
auch das geht, aber meist geht das durchaus ohne, wie sieht denn deine where Klausel aus?
mfg
Dieter Bender
Hallo,
ich werde vorerst die von B.Hauser beschriebene Variante implementieren, allerdings würde mir die direkte Nutzung der Hostvariablen auch besser gefallen.
Kann man dies über das Einbinden der SQLDA ev. lösen?
Wo gibt es dazu gut beschriebene Beispiele?
Danke!
Joe
Hallo,
nachfolgende SR erzeugt mir jetzt das UPDATE-Statement mit der Where-Klausel.
MfG,
Joe
begsr crt_updstmt;
// --- SQL-statement löschen -----------------------------------------------------------
reset sqlstmt;
// Update-Statement übernehmen
sqlstmt = 'UPDATE Datei set Wert1 = ' + %char(Hostvar1) + ', ' +
'Wert2 = ' + %char(Hostvar2) + ', Wert3 = ' + c_HC +
Hostvar3 + c_HC + ', ' + 'Wert4 = ' + %char(Hostvar4);
§where = *off;
// Where-Bedingung an Update anfügen
if where1 <> ' ' and
where1 <> '***';
if §where = *off;
sqlstmt = %trim(sqlstmt) + ' ' + c_where +
' where1 = ' + c_HC + Hostvar5 + c_HC;
§where = *on;
else;
sqlstmt = %trim(sqlstmt) + ' ' + c_and +
' where1 = ' + c_HC + Hostvar5 + c_HC;
endif;
endif;
if where2 <> 0;
if §where = *off;
sqlstmt = %trim(sqlstmt) + ' ' + c_where +
' where2 = ' + c_HC + %char(Hostvar6) + c_HC;
§where = *on;
else;
sqlstmt = %trim(sqlstmt) + ' ' + c_and +
' where2 = ' + c_HC + %char(Hostvar6) + c_HC;
endif;
endif;
//usw,...
endsr;
Hallo,
wenn das bei dem usw. strukturell genauso weiter geht, dann lässt sich das mit:
update mytable
set myColumn = :myColumn
where
column1 between :low1 and :high1
and column2 between :low2 and :high2
sogar als statisches SQL lösen.
wenn dann eine Bedingung für columnX ausfallen soll, dann besetzt man lowX mit loval und highX mit highval
mfg
Dieter Bender
udate
Hallo,
nachfolgende SR erzeugt mir jetzt das UPDATE-Statement mit der Where-Klausel.
MfG,
Joe
begsr crt_updstmt;
// --- SQL-statement löschen -----------------------------------------------------------
reset sqlstmt;
// Update-Statement übernehmen
sqlstmt = 'UPDATE Datei set Wert1 = ' + %char(Hostvar1) + ', ' +
'Wert2 = ' + %char(Hostvar2) + ', Wert3 = ' + c_HC +
Hostvar3 + c_HC + ', ' + 'Wert4 = ' + %char(Hostvar4);
§where = *off;
// Where-Bedingung an Update anfügen
if where1 <> ' ' and
where1 <> '***';
if §where = *off;
sqlstmt = %trim(sqlstmt) + ' ' + c_where +
' where1 = ' + c_HC + Hostvar5 + c_HC;
§where = *on;
else;
sqlstmt = %trim(sqlstmt) + ' ' + c_and +
' where1 = ' + c_HC + Hostvar5 + c_HC;
endif;
endif;
if where2 <> 0;
if §where = *off;
sqlstmt = %trim(sqlstmt) + ' ' + c_where +
' where2 = ' + c_HC + %char(Hostvar6) + c_HC;
§where = *on;
else;
sqlstmt = %trim(sqlstmt) + ' ' + c_and +
' where2 = ' + c_HC + %char(Hostvar6) + c_HC;
endif;
endif;
//usw,...
endsr;
Hallo,
ich werde den von Hr. Bender angesprochenen Lösungsansatz auch ausprobieren.
Danke für eure Hilfe!
Joe