[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Jan 2007
    Beiträge
    904

    Dynamisches SQL mehrere where klauseln

    Hallo Forum,
    Ich stehe vor folgendem Problem:
    ich möchte mit SQL eine Subfile Selektion machen. Dafür habe ich mehrere Selektierfelder.
    Wie ich ein dynamisches SQL zusammenbauen muss, weiss ich:

    select * from ADRFILE into :AdrDS where upper(ADNAME) like upper(:#NAME)
    oder so
    select * from ADRFILE into :AdrDS where upper(ADNAME) like upper(?)

    Finde jetzt den Fehler. Mit Parametermarkern ist es so eine Sache, da ich nicht genau weiss, welche schliesslich gebraucht werden und auf Blank Dateninhaltabfragen bin ich auch nicht scharf.

    Jetzt:
    Kann ich das obige Statement mit dem :NAME so verwenden oder muss ich wirklich über die Marker gehen?

    Danke für die Tipps
    kf

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    "?" benötigst du nur in dynamischen SQL's.
    Wobei da eben das Problem besteht, dass die Parameter den Anzahl Fragezeichen in Folge entsprechen müssen.

    Pragmatisch funktioniert dies auch so (habe ichdes öfteren gesehen und benutzt)

    where (:#Name = '' or upper(ADNAME) like :#Name) ...

    Man muss dann halt nur schauen, dass genügend Indizes vorhanden sind um noch flexibel zu sein.
    Das ist halt der Nachteil von statischen Programmiersprachen.
    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
    Jan 2007
    Beiträge
    904
    Pragmatisch hüpf ich zum Fenster raus. Das würde bedeuten, wenn ich jetzt noch den Ort oder die Strasse hinznehme die Statements so lauten (Wildcards muss ich ja auch beachten):

    where (:#Name = '' or upper(ADNAME) like upper(:#Name) or upper(ADNAME) = upper(:#Name))
    and (
    :#Ort = '' or upper(ADORT) like upper(:#Ort) or upper(ADORT) = upper(:#Ort))
    and
    (:#Strasse = '' or upper(ADSTR) like upper(:#Strasse) or upper(ADSTR) = upper(:#Strasse))

    Richtig? Könnte damit leben. Danke.
    Last edited by camouflage; 15-02-22 at 17:29. Grund: Statements korrigiert
    kf

  4. #4
    Registriert seit
    Jan 2007
    Beiträge
    904
    Läuft wie ein "Örgeli" wie man in der Schweiz zu sagen pflegt.
    kf

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    "Pragmatisch hüpf ich zum Fenster raus."

    Hm, was meinst du damit?
    Wenn du es wirklich dynamisch mit dynamsichen Parametern machen willst, so ist der Aufwand nicht unerheblich (habe ich auch schon gemacht, in COBOL ca. 2001):

    Du bildest das SQL mit den "?" als Parametern.
    Dazu nimmst du eine selber beschrieben SQLDA-Struktur, die ein Array zu den Parametern (SQLVAR) enthält.
    Jedes Array-Element enthält den numerischen SQL-Typ, die Ausprägung (Größe [, Nachkomma]) sowie einen Pointer der auf den Inhalt verweist.

    Nach dem "exec sql prepare ...." machst du nur noch den "execute sql execute ... using SQLDA ...".
    Eigentlich ganz easy.

    Übrigens: auch das Lesen lässt sich mit SQLDA ganz flexibel realisieren.

    Da finde ich meine pragmatische Lösung einfacher und auf Grund der möglichen Optimierung durch die IBM i selber auch nicht zeitkritisch.
    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

  6. #6
    Registriert seit
    Jan 2007
    Beiträge
    904
    Baldur,
    Danke für die Anmerkung. Doch warum soll ich eine oberschlau Schlagmichtotsuperlösung erarbeiten, wenn es einfacher auch geht. Da muss ich niemanden mehr etwas beweisen.
    kf

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Weil eine Schlagmichtotsuperlösung vielleicht einfach nur geil ist;-)?

    Aber im Ernst, deshalb mache ich ja die pragmatische Lösung, die Schlagmichtotsuperlösung ist im Clientumfeld eher die Regel, da SQL's und Ergebnisse sowieso grundsätzlich dynamisch sind.
    Frag mal die Javafraktion auf der IBM i, die kennt solche Probleme gar nicht.
    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
    Mar 2002
    Beiträge
    5.286
    ... irgendwie verstehe ich die Anforderung und eure Diskussion nicht. Unvollständige Selektionen gehen auch mit simplem statischem SQL mit Parametermarkern mit between oder auch mit like.
    - Feld between lowval and highval => keine Einschränkung
    - Feld between :wert and :wert => nur mit Feld = Wert
    etwas aufgebohrt kann das auch größer, bzw kleiner

    - Feld like '%' => keine Einschränkung
    - Feld like :wert => nur mit Feld = Wert
    etwas aufgebohrt kann das auch echtes like (alle Kunden, bei denen der Ort mit 'F' und der Name mit 'M' anfängt etc.).

    Das brummt dann auch mit elementarem Index-Design.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Der obere SQL ist doch statisch mit Hostvariablen. Parametermarker gibts nur bei dynamischem SQL, was u.U. in ILERPG halt schwierig ist.
    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
    Mar 2002
    Beiträge
    5.286
    ... schneller geschrieben als gedacht. Parametermarker braucht man da keine, man besetzt die Hostvariablen der nicht benötigten Selektionen mit loval/highval und die anderen jeweils mit dem Auswahlwert (like entsprechend).

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Ja das geht auch, ist allerdings performancenegativ.
    Wenn ich alle Paramter mit Low/High und nur 1 auf einen bestimmten Wert kann SQL nicht über Index optimieren. Wenn ich einen Parameter mit Leer prüfe und nur den gewünschten Parameter fülle, kann SQL den passenden Index nehmen.
    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
    Aug 2001
    Beiträge
    2.869
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Ja das geht auch, ist allerdings performancenegativ.
    Wenn ich alle Paramter mit Low/High und nur 1 auf einen bestimmten Wert kann SQL nicht über Index optimieren. Wenn ich einen Parameter mit Leer prüfe und nur den gewünschten Parameter fülle, kann SQL den passenden Index nehmen.
    Und warum denn nicht?
    Solange die Original-Spalte auf der linken Seite des Vergleichsoperators (BETWEEN) nicht verändert wird (z.B. durch eine Scalare Funktion) KANN der Optimizer einen regulären Binary Radix Tree Index verwenden.
    Ob er es denn tut, hängt mit anderen Faktoren zusammen.

    ... und selbst wenn auf der linken Seite des Vergleichsoperators die Spalte verändert wird, kann der Optimizer sogar einen entsprechenden Derived Index verwenden.

    Kleiner Tipp: bevor man irgendwelche Behauptungen in den Raum stellt, sollte man das Ganze doch mal ausprobieren.

    Click image for larger version. 

Name:	Index-Verwendung.jpg 
Views:	6 
Size:	115,0 KB 
ID:	631
    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

Similar Threads

  1. Dynamisches embedded SQL
    By Tschabo in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 11-03-21, 10:14
  2. dynamisches SQL mit Clob möglich?
    By msost in forum NEWSboard Programmierung
    Antworten: 18
    Letzter Beitrag: 07-04-17, 15:23
  3. SQLDA - dynamisches SQL SUM Funktion
    By chrisssiie in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 05-09-16, 14:27
  4. Dynamisches SQL bauen in RPG
    By labm in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 07-05-15, 08:55
  5. TCP/IP-Leitwege - Dynamisches Eintragen verhindern?
    By mott in forum IBM i Hauptforum
    Antworten: 7
    Letzter Beitrag: 18-09-02, 16:42

Berechtigungen

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