[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Feb 2018
    Beiträge
    7

    rpg sql, where mit "in" und hostvariable

    hallo allerseits,

    heute hatte ich folgendes Problem und frage mich, warum das so nicht klappt...

    aufgabe: es soll im rpg mit einem SQL-Statement geprüft werden, ob ein wert in einer liste von werten vorkommt.

    die Idee war, das SQL so zu schreiben:

    dcl-s found ind inz;
    exec SQL select '1' into :found from Datei where dateifeld in('ABC', 'DEF', 'YXZ');
    das würde ja noch funktionieren, jetzt aber die variante, die leider nicht klappt:


    dcl-s found ind inz;
    dcl-s vergleich char(50);
    vergleich = ' (''ABC'', ''DEF'', ''YXZ'') ';

    exec SQL select '1' into :found from Datei where dateifeld in :vergleich ;

    da findet das SQL nix, sqlcode = 100

    kann mir jemand sagen, ob man so eine where-Bedingung mit in und hostvariable überhaupt machen "darf"?

    ich habe das jetzt mit dyna-SQL gelöst, klappt 1a, aber mich würde interessieren, was an der variante oben falsch gemacht ist.

    danke :-)

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Das geht so nicht.
    Du musst für jedes Element eine eigene Host-Variable definieren.

    Die andere Alternative wäre dynamisches SQL zu verwenden

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  3. #3
    Registriert seit
    Feb 2018
    Beiträge
    7
    hallo Birgitta,
    habe es befürchtet, aber gut zu wissen! mit dyna-SQL funktioniert es ja prima..
    danke für deinen hinweis!
    lg Karin

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Wenn man die Strings entsprechend zusammenschustert kann man das auch per POSSTR() in einem Rutsch erledigen:

    Posstr("!W1! !W2!", "!W1!") > 0

    vergleich = ' ''ABC'' ''DEF'' ''YXZ'' ';
    exec SQL select '1' into :found from Datei where posstr(:vergleich, '"' concat dateifeld concat '"' > 0;
    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
    Feb 2018
    Beiträge
    7
    cool, klappt, ist gespeichert, so einfach..., danke!!!

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Die Lösung von Balur geht allerdings auf die Performance! Mit POSSTR kann der Optimizer keinen Index verwenden, d.h. es werden alle Datensätze verarbeitet, was bei großen Tabellen laaaaaaaaaaaange dauern kann.
    Bei der Version mit IN kann der Optimizer einen Index verwenden und somit gezielt zugreifen.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Das ist von Fall zu Fall unterschiedlich. Ob es auf die Performance geht entscheiden auch weitere Randbedingungen.
    Wobei ich bisher noch nie gesehen habe, dass eine IN-Klausel mit Konstanten einen Index bevorzugt hätte.
    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

Similar Threads

  1. Antworten: 1
    Letzter Beitrag: 19-07-17, 11:38
  2. "Achtung"-Lampe lässt sich nicht löschen.. ?
    By hel400 in forum IBM i Hauptforum
    Antworten: 13
    Letzter Beitrag: 25-05-17, 23:57
  3. Antworten: 1
    Letzter Beitrag: 20-05-17, 21:34
  4. MinusField falsche Darstellung "ü" statt "-"
    By Edi in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 07-11-14, 07:52
  5. Cobol/400 - "Fett", "Unterstreichen" als HEX-Wert
    By RLurati in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 05-08-14, 09:10

Berechtigungen

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