[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jun 2001
    Beiträge
    1.979

    SQL ... where feld in(:invar)

    Hi,

    SQLRPGLE, V7R1

    ich habe eine Variable inVar, char 100 und eine Datei mit einem Feld FELD Numerisch 3

    wenn ich inVar mit '100' fülle und
    Code:
    C*EXEC SQL                                             
    C* SET :C =(SELECT COUNT(*) FROM DATEI                
    C*    WHERE KEY1 = 9000000 AND FELD IN(:inVar)) 
    C*END-EXEC
    ausführe bekomme ich eine Zahl.

    fülle ich inVar mit '100, 124' bekomme ich einen Fehler
    cpd4374 und sql0302, code 6, Ungültige numerische Daten


    1. Warum
    2. gibt es alternativen

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

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.262
    Auch dieses Thema hatten wir schon mehrfach. Die Syntax laut SQL ist ja:

    in (V1, V2, ...)

    Mit Variablen eben dann:

    in(: V1, : V2, ...)

    Dein Ansatz geht so halt nicht.
    Außerdem solltest du den Feldtyp der Vergleichsvariablen anpassen, damit kein casting provoziert wird.

    Alternative 1:

    Mehrere Variablen (max. soviel wie benötigt) und ggf. Init mit einem nicht vorhandenen Wert (*loval).

    Alternative 2:

    Dynamischen SQL mit Cursor from Statement, Prepare, Open, Fetch, Close.
    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

  3. #3
    Registriert seit
    Aug 2001
    Beiträge
    2.879
    Das kannst Du so nicht machen!
    Du musst entweder für jedes Element in der IN-Anweisung eine Hostvariable angeben oder dynamisches SQL verwenden.

    Alternativ geht aber auch so was:

    Code:
     /Free
        MyString = 'Value1' + ', ' + Value2 + ', ' + ... 'ValueN' + ', ';
    
        Exec SQL Declare Cursor  ... For
        Select ...
           From ...
           Where :MyString Like '%' concat Trim(MyColumn) concat ', %'
     ...
     /End-Free
    Performancemäßig musst Du allerdings prüfen wie sich das Ganze verhält. Könnte in einem Table Scan enden.

    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

  4. #4
    Registriert seit
    Jun 2001
    Beiträge
    1.979
    @beide

    Ich dachte halt, ich könnte das System überlisten.
    ca. 30 Variablen definieren... hm, nicht wirlich.

    Hab nun dynamisches sql drin. geht auch. Sind halt nur mehr Zeilen code.

    Schade eingentlich.

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

  5. #5
    Registriert seit
    May 2002
    Beiträge
    1.121
    Zitat Zitat von Robi Beitrag anzeigen
    @beide

    Sind halt nur mehr Zeilen code.

    Schade eingentlich.

    Danke
    Robi
    Es gab mal Zeiten, da war jede Zeile Code bares Geld

  6. #6
    Registriert seit
    Jun 2001
    Beiträge
    1.979
    Einige Zeilen mehr, die der lesbarkeit dienen, sind immer willkommen. Kommentare die das Problem beschreiben und nicht den RPG Befehl
    Code:
    C       key         chain datei                      datei lesen
    sind auch gewünscht.

    aber SQL im RPG, erst recht ohne /free, und das wilde zusammenbasteln des Strings verunstalten machmal eine Source.
    Das versuchen wir zu vermeiden.
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  7. #7
    Registriert seit
    Feb 2009
    Beiträge
    391
    30 Variablen? Warum so kompliziert.
    Das sind doch Werte die man einfach in eine Datei schreiben kann und dann mit einem JOIN verknüpfen kann.

  8. #8
    Registriert seit
    Jun 2001
    Beiträge
    1.979
    Ja Natürlich.
    Nur wirds dann noch komplizierte und langsamer.

    Die Werte werden erst zur Laufzeit bekannt und sind fast immer anders.
    Ich müßte also in Lauf 1 die Datei mit den Werten erzeugen und in Lauf 2 hoffen das sie noch gelten (ok, das ist warscheinlich in 99,99 % der Fälle so)

    In meinem Bsp.: (So gehts halt nur nicht)
    eval invar = '100'
    :loop bis ...
    sql
    verarbeitung
    eval invar = %trim(invar) + ', ' + char(Feld
    )
    endloop

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

  9. #9
    Registriert seit
    Feb 2009
    Beiträge
    391
    Ein select where in() ist mit Sicherheit nicht schneller als ein Join. Notfalls richtet man noch nen dauerhaften Index ein, wenn man das Ganze zusätzlich beschleunigen will.
    Aber von außen ist es auch schwer da eine Einschätzung zu machen was da jetzt kompliziert ist oder nicht und wo man da den besten Lösungsansatz vornimmt.
    Wohlmöglich sollte man der Datenbank einfach einen fertigen Wert verpassen, damit das Count obsolete wird. Das ist meist noch am besten für die Performance.

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.262
    Ein IN(...) mit Konstanten statt "Select" ist sicherlich schneller als ein Join, der ja einen zusätzlichen Zugriff bedeutet.
    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

  11. #11
    Registriert seit
    Jul 2001
    Beiträge
    2.646
    Zitat Zitat von Robi Beitrag anzeigen
    Sind halt nur mehr Zeilen code.
    Schade eingentlich.
    Lieber mehr Zeilen Code - die man vielleicht auch besser lesen kann - als ein überlistetes System. Sonst überlistet das System Dich beim nächsten Update ;-)

    -h
    www.RZKH.de
    IBM Champion 2022, 2023, 2024
    IBM i Community Advocate https://www.youracclaim.com/badges/6...c-7ad4ba147af6
    Common / CEAC
    http://pub400.com

  12. #12
    Registriert seit
    Nov 2003
    Beiträge
    2.310
    Zitat Zitat von malzusrex Beitrag anzeigen
    Es gab mal Zeiten, da war jede Zeile Code bares Geld
    Macintosh Stories: -2000 Lines Of Code

Similar Threads

  1. per SQL Feld ändern...
    By svente in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 23-01-07, 09:49
  2. sql num. Feld formatieren
    By rr2001 in forum IBM i Hauptforum
    Antworten: 9
    Letzter Beitrag: 11-07-06, 14:10
  3. SQL Insert ein Feld Hochzählen
    By linguin in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 07-01-06, 15:46
  4. Feld mit loval via SQL belegen
    By Booley in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 18-08-05, 08:33

Berechtigungen

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