View Full Version : SQLCOD, die zweite
Gehts eigentlich ohne mich ????
"Prepare Using" ? Kenn ich nicht !!!
Dein Problem, Peter, ist, dass Hostvariablen nicht "prepared" werden können sondern dies eine Eigenschaft des Pre-Compilers ist, schau dir mal die Auflösung im Spool an, dann verstehst du es besser.
Im Prepare funktioniert also ":HOSTVAR" nicht, da ja HOSTVAR als Adresse nicht zur Verfügung steht.
Wie wärs dann mit folgender Variante:
SQLSTA = 'Select bla bla bla where Feld1 = ''' + Feld1 + ''''
bzw bei numerischen Feldern:
SQLSTA = 'Select bla bla bla where Feld1 = ' + %char(Feld1)
So ist dann mit allen Bedingungen zu verfahren !
Die 2. Alternative mit "?" (=ParameterMarkern) funktioniert nur beim OPEN !!
Also:
SQLSTA = 'Select bla bla bla where Feld1 = ?'
Prepare ...
open S1 using :Feld1, :Feld2, ...
Achtung:
Du benötigst dann allerdings für jede Variante ein eigenes Open-Statement, da jedem "?" ein passendes Feld zugeordnet werden muss.
peter.kinne
20-09-04, 18:11
Danke an Dieter (klar finde ich Deine Antworten
auch h e u t e gut) und an den "frisch erholten" Urlauber, Fuerchau.
peter.kinne
20-09-04, 18:14
Noch eine Frage.
Gibt es zu dem Thema "Embedded SQL" eine Buchempfehlung, am besten auf Deutsch. Bei Mr. Google kann ich dazu nichts finden.
Denn ich würde das Thema gerne komplett verstehen. Und das ist im Moment bei mir noch nicht gegeben.
Denn es ist alles viel komplexer wie ich dachte :-(
Peter
"Prepare Using" ? Kenn ich nicht !!!
Sorry ich hatte heute morgen gepennt, Peter arbeitet ja mit Cursor.
PREPARE ... USING funktioniert, wenn man mit dynamischem SQL ohne Cursor arbeitet. Arbeitet man mit Cursor muss man die Parameter-Marker beim OPEN ersetzen.
Bei dynamischem SQL ohne Cursor hat man 2 Möglichkeiten:
1. Den String direkt mit EXECUTE IMMEDIATE auszuführen. Dabei wird der String bei jedem Aufruf in ein ausführbares SQL statement konvertiert.
2. Statt EXECUTE IMMEDIATE kann man mit den SQL statements PREPARE und EXECUTE arbeiten. In diesem Fall kann man im String Parameter Marker setzen und diese dann beim PREPARE ersetzen. Da PREPARE und EXECUTE getrennte Befehle sind, kann man das gleiche SQL statement mehrfach aufrufen, ohne jedesmal den String in ein ausführbares SQL Statement konvertieren zu müssen.
@Peter:
Schau doch mal unter folgendem Link. Die Beschreibung ist zwar nur auf Englisch, aber recht einfach zu lesen mit vielen Beispielen:
Embedded SQL (http://member.netease.com/~jnkey/as400flr/400learn/sql400tutorial/chap15/chp15.htm)
Birgitta
@Birgitta
Sorry ich hatte heute morgen gepennt, Peter arbeitet ja mit Cursor.
PREPARE ... USING funktioniert, wenn man mit dynamischem SQL ohne Cursor arbeitet. Arbeitet man mit Cursor muss man die Parameter-Marker beim OPEN ersetzen.
Birgitta
immer noch müd' oder schonn widder?
Beim prepare werden keine Parametermarker besetzt, ob mit oder uhne Cursor, das macht ja auch keinen Sinn.
Dieter
PS: wie hat der anner gesagt: ein Glück das heit' Freitag iss!
peter.kinne
20-09-04, 19:56
@Birgitta
Der Link ersetzt das von mir gesuchte Buch. Ist ja alles sehr schön erklärt. Und so schlecht ist mein Englisch ja auch nicht.
Danke und Gutes Nächtle,
Peter
@Birgitta
immer noch müd' oder schonn widder?
Beim prepare werden keine Parametermarker besetzt, ob mit oder uhne Cursor, das macht ja auch keinen Sinn.
Dieter
PS: wie hat der anner gesagt: ein Glück das heit' Freitag iss!
@Dieter
Das kommt davon, wenn man nur mal so schnell einen halbherzigen Blick in die SQL Referenz wirft und dort beim PREPARE ein Using sieht, statt sich die Quelle eines funktionnierenden Programms anzuschauen!
Fürs nächste Mal gelobe ich Besserung!
Birgitta
@Birgitta,
warum solls dir anders gehen als mir, schließlich hat man ja noch eine kleine Nebenbeschäftigung und investiert nur begrenzt Zeit in Foren, Newsgroups etc.
mfg
Dieter
@Dieter
Das kommt davon, wenn man nur mal so schnell einen halbherzigen Blick in die SQL Referenz wirft und dort beim PREPARE ein Using sieht, statt sich die Quelle eines funktionnierenden Programms anzuschauen!
Fürs nächste Mal gelobe ich Besserung!
Birgitta
Execute funktioniert aber leider nicht bei "Select" sondern nur bei Nicht-Select-SQL's. Dort gibts dann auch Parametermarker die mit USING besetzt werden müssen.
Wenn man dynamische Select's benötigt gehts nicht ohne Cursor.
Ein Select, der nur 1 Zeile liefert, kann ohne Cursor allerdings nur als embedded Select verwendet werden. Liefert dieser allerdings doch mal mehr als 1 Zeile, gibts einen SQL-Fehler.