PDA

View Full Version : SQL UPDATE mit Hostvariablen (Wie geht das?)



CrazyJoe
30-05-07, 20:51
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

B.Hauser
30-05-07, 21:12
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

Fuerchau
31-05-07, 07:25
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

CrazyJoe
31-05-07, 09:20
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

BenderD
31-05-07, 09:55
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

CrazyJoe
31-05-07, 10:16
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;

BenderD
31-05-07, 10:30
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;

CrazyJoe
31-05-07, 13:16
Hallo,

ich werde den von Hr. Bender angesprochenen Lösungsansatz auch ausprobieren.

Danke für eure Hilfe!

Joe