[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jan 2012
    Beiträge
    1.120

    Variable als Selektionsbegriff im "in" bei embedded SQL

    Hallo,
    ich möchte per statischem embedded SQL eine where - Selektion mittels "in" und einer Variable erzeugen. Das funktioniert nicht.

    Beispiel:

    inSelekt = '1000000160994, 1000000323058, 1000000014723';


    exec sql select count(*) into :i from kunde
    where ku_aktiv = 'X' and ku_vbnr in (:inSelekt);

    Das ergibt den SQL-Fehler -302. Hat jemand eine Idee? (Die Klammern in den Selekt-String zu packen, hat auch nichts gebracht.

    Dieter

  2. #2
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Ich sehe gerade: So kann es natürlich nicht gehen, da das Feld ku_vbnr numerisch ist. Der Selektionsstring ist alpha. Geht das ganze mit numerischen Felder nicht? (Ich denke, ein Transformieren in Alpha ist zu langsam).

    Meine eigentliche Aufgabenstellung ist die: Ich habe ein Array von numerischen Schlüsseln und möchte alle Datensätze lesen, die diesen Schlüsseln entsprechen.

    Dieter

  3. #3
    Registriert seit
    Aug 2003
    Beiträge
    1.508

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    where Feld in (: V1, : V2, ... , : Vn) ...
    Führe einfach alle Variablen auf.
    initialisiere ggf. auf *LOVAL für nicht verwendetet Elemente.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    @andreas:
    Danke, aber dynamisches SQL wollte ich ja vermeiden.

  6. #6
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    @baldur:
    Danke, die Idee ist mir noch nicht gekommen. Gut zu wissen, dass das geht. Aber das löst leider mein Problem nicht, da es theoretisch sehr viele Werte sein können (1000).

    Dieter

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Nun ja, entweder dynamisches SQL oder statisches.
    Beim statischen SQL musst du eben 1000 Variablen aufführen.
    Aber es gibt da noch einen kleinen Trick (den ich auch gerne verwende):

    Nimm deine obige InSelekt-Variable und baue die Werte immer mit einen Trennzeichen zusammen (auch am Ende!).
    "Wert1; Wert2; .....; WertN; "

    Nun vergleiche:

    where POSSTR(: InSelect, char(Feld) concat '; ' ) > 0

    Bei numerischen klappt das ja ganz gut. Bei Zeichenketten muss man sich da schon ein Trennzeichen einfallenlassen, dass so nicht vorkommt. Hier bieten sich Hexwerte ganz gut an, da dies sowohl von ILERPG als auch SQL unterstützt wird, z.B. X'01'.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  8. #8
    Registriert seit
    Jun 2001
    Beiträge
    1.975
    Wenn die Werte noch nicht alle feststehen und es sehr viele werden können ...
    Stehen die evtl. in einer Datei ?

    select ... from ... where feld in (select distinct Feld2 from Datei where ... )

    Robi
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Aus Performancegründen kann es besser sein "where exists (select * from filex where outerfile.field = filex.key)". Hier wird von SQL nur ein Zugriff (bei Index) durchgeführt. Beim obigen "in (select distinct ...)" wird dies ggf. für jeden Satz wiederholt!
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  10. #10
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Vielen Dank an alle. Ich bin mir bewusst, dass es eine ganze Reihe von Möglichkeiten gibt, das Problem anders zu lösen: Dynamisches SQL, Schlüssel in eine Datei schreiben, ...

    Mein Favorit war halt statisches SQL. Deshalb habe ich gefragt.
    @Baldur: Der Trick ist nicht schlecht, aber ich befürchte da doch Performanceeinbußen, da das SQL ja erstmal eine char-Funktion für jeden Satz der Datei ausführen müsste.

    Aber ihr alle habt mir sehr weitergeholfen, weil ich jetzt weiß, dass es über meinen favorisierten Weg nicht geht. Ich werde jetzt irgendeinen anderen Weg nehmen.

    Vielen Dank.

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Dateizugriffe kosten Performance!
    Ein bisschen Rechnerei ist da eher unkritisch. Ich denke pro Satzzugriff kannst du durchaus mehrere Millionen Rechenoperationen durchführen.
    Die Performance ist weniger das CHAR und der POSSTR sondern dass deine Selektion keinen Index verwenden kann.
    Was du wohl machen kannst ist:
    - Schreibe die In-Werte in eine neue Tabelle, ggf. Job-Nr. als Hilfskey
    - Verknüpfe deinen SQL mit "inner join ", aber ggf. von der neuen Tabelle auf die Haupttabelle
    Man sollte immer einen
    "Select ... from KleinsteTabelle inner/left join GrößereTabelle on ..." versuchen und für die Beziehungen Indizes anlegen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  12. #12
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Ich bin bereits dabei, eine Hilfsdatei anzulegen.

    Aber nochmal zu deinem Posstr. Ich meinte nicht die Perfomance wegen der Berechnung, sondern die Problematik, dass wegen des fehlenden Index jeder Satz der Datei mit Posstr überprüft werden muss.

    Danke nochmal.
    Dieter

Similar Threads

  1. Antworten: 4
    Letzter Beitrag: 15-10-14, 14:56
  2. Antworten: 0
    Letzter Beitrag: 08-10-14, 12:49
  3. Cobol/400 - "Fett", "Unterstreichen" als HEX-Wert
    By RLurati in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 05-08-14, 09:10
  4. starten Group Job in einer Interaktiven Session "vom aussen"
    By OMi in forum NEWSboard Programmierung
    Antworten: 11
    Letzter Beitrag: 17-02-14, 14:44
  5. "zu wenig Speicher" Rational Developer for Power-Systems
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 13-02-14, 20:58

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •