View Full Version : Statisches Embedded SQL mit IN
dschroeder
24-08-15, 10:55
Hallo,
weiß jemand, ob man ein IN Prädikat im statischen embedded SQL einsetzen kann, bzw. wie das funktioniert?
Folgendes Statement läuft zwar, liefert aber nicht immer die korrekten Ergebnisse.
where ...
zp_belawer in :g#belawerSel)
In der Datei steht im Feld zp_belawer (char1) ein V.
Wenn in der Hostvariable "V", steht klappt es. Ich möchte aber, dass der User eine Reihe von Werten eingeben kann. In der Hostvariable sollte also so etwas wie "V, K, E" stehen.
Dann klappt die Selektion aber nicht.
Dieter
Das geht so nicht!
Die einzige Möglichkeit ist, eine Anzahl von Variablen vorzudefinieren und im (statischen) embedded SQL zu verwenden.
Die erfassten Werte werden in die Variablen eingepflegt und in die "fehlenden" wird einfach der erste eingegebene Wert wieder übernommen.
Mit Trick17 geht's auch statisch, aber wahrscheinlich ist das nicht unbedingt perfomant.
1. Die erfassten Werte werden hintereinander in einen String geschrieben, der dann mit LIKE durchforstet wird.
2. Auswahl V, K, E --> String 'V, K, E,'
3. LIKE-Anweisung
:String like '%' concat Trim(Spalte) concat ',' concat '%'
Ansonsten hilft nur dynamisches SQL.
Birgitta
dschroeder
24-08-15, 11:16
Habe gerade gesehen, dass ich die gleiche Frage vor ein paar Jahren schon mal gestellt habe. Das scheint also nicht zu gehen. Werde deshalb dynamisches SQL verwenden.
Dieter
hattest du die Frage nicht schon mal?
http://newsolutions.de/forum-systemi-as400-i5-iseries/threads/19415-Variable-als-Selektionsbegriff-im-quot-in-quot-bei-embedded-SQL?highlight=robi
-> Hat sich erledigt, du hast es gemerkt ...
Natürlich geht das auch mit statischem SQL.
Du benötigst halt nur entsprechend viele Host-Variablen:
in (: MyV1, : MyV2, : MyV3, ..., : MyVn)
Hier kann u.U. auch ein Index verwendet werden.
An Stelle von Like kannst du auch posstr() verwenden:
where posstr(MyVar, : MyHostVar) > 0
MyHostVar enthält die Liste der Kennzeichen. Allerdings kann hier kein Index verwendet werden.
Je nach weiteren Where-Bedingungen spielt ein Index über dieses Feld aber sowieso keine besondere Rolle.
dschroeder
24-08-15, 12:08
Danke an alle.
Dieter
... man könnte natürlich eine table function schreiben, die einen String als Tabelle darstellt und dannn diese function verwenden
select ...
from ...
where ... in (select (string2table( :myVar))
folgende Oracle Lösung (http://blog.tanelpoder.com/2007/06/20/my-version-of-sql-string-to-table-tokenizer/) sollte nach V7 im DB2 auf AS/400 portierbar sein.
D*B
der so seine Zweifel hat, dass das auf der AS wirklich brummt, da dürfte die dynamic SQL Variante mit variablem SQLString einfacher und schneller sein.
dschroeder
24-08-15, 13:05
Nochmals Danke für alle Antworten. Ich habe jetzt dynamisches SQL verwendet. Das mag ich eigentlich nicht so gerne, weil man da im RDi kein Syntax-Highlighting und keine Compilerprüfung erhält.
Dieter