[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jul 2012
    Beiträge
    4

    dynamisches sql mit group by

    Hallo,

    ich sollte eine sehr umfangreiche tabell nach frei wählbaren Feldern verdichten.
    Rein logisch funktioniert das mit folgendem Statement

    Code:
    select feld1, feld2, feld3, sum(wert1), sum(wert2) 
    from tabelle
    group by feld1, feld2, feld3
    Es ist aber so, dass es verschiedene Felder in verschiedender Anzahl sein können.

    Ein SelectStatement zu erzeugen ist kein Problem, aber wie kann ich einen Satz mit einer variierender Anzahl von Feldern "fetchen"? - hier muss ja normalerweise die genaue anzahl der Fehlder angegeben werden.

    danke schonmal
    gruss
    ennsman

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Das ist dann schon etwas komplizierter.
    Hierfür musst du SQLDA-Tabellen anlegen, mit Pointern arbeiten, "describe statement" aufrufen und beim Fetch dann "...using sqlda..." verwenden.
    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 2003
    Beiträge
    1.508
    ... viel zu kompliziert eigentlich ...
    Meiner Meinung geht das am "einfachsten" mit dem SQL Descriptor.

    Ich hab mir da mal ein Beispiel-PGM zusammen gebastelt. Leider gibts darüber nicht viel Dokus bei der IBM.
    Aber so sollte es klappen :

    Code:
    D vsql            s            512
    D vtype           s             10
    D vlength         s             10  0
    D vresult_ind     s             10  0
    D vCount          S             10  0
    D i               S             10  0
     /Free
    
      //---- Sql Optionen setzen ----
      Exec Sql SET OPTION COMMIT=*NONE, CLOSQLCSR=*ENDMOD,
                           ALWBLK=*ALLREAD, ALWCPYDTA=*YES,
                           SRTSEQ=*HEX, DLYPRP=*YES;
    
      // SQL Cursor erstellen
      vSql = 'Select * From tab1';
      Exec Sql Prepare S1 from :vsql;
      Exec Sql Declare c1 Cursor For s1;
    
      // Descriptor mit der max. Anzahl der Spalten initialisieren
      Exec Sql allocate descriptor 'mydesc' with max 2;
      EXEC SQL DESCRIBE S1 Using descriptor 'mydesc';
    
      // Ersten Satz einlesen
      Exec Sql open c1;
      Exec Sql Fetch c1 into sql descriptor 'mydesc';
      
      // Anzahl der Spalten abrufen
      EXEC SQL GET DESCRIPTOR 'mydesc' :vCount = COUNT;
      
      // Alle Spalten mit deren Werte einlesen
      For i=0 to vCount;
    
        // Attribute der Spalte einlesen
        Exec Sql GET DESCRIPTOR 'mydesc' VALUE :i
                          :vtype = TYPE,
                          :vlength = LENGTH,
                          :vresult_ind = INDICATOR;
        if vresult_ind >= 0;
          Select;
          When vtype = '1'; // Character
            exec Sql GET DESCRIPTOR 'mydesc' VALUE :i
                            :sp2 = DATA;
          When vtype = '4'; // Integer
            exec Sql GET DESCRIPTOR 'mydesc' VALUE :i
                            :sp1 = DATA;
          endsl;
        endif;
      endfor;
      
      Exec Sql close c1;
      *INLR = *ON;
     /End-Free

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Das vereinfacht die Sache natürlich nicht unerheblich.
    Ab welchem Release ist das denn dazu gekommen?
    Mit SQLDA's arbeite ich seit V4R3, aber man kann ja nicht alles kennen.

    Allerdings benötigt man da ja erheblich mehr SQL-Aufrufe so dass SQLDA's, wenn auch komplzierter, dann doch wohl schneller sind (1 Fetch = alle Felder).
    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
    Aug 2003
    Beiträge
    1.508
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Ab welchem Release ist das denn dazu gekommen?
    Kann ich jetzt gar nicht genau sagen. Ab V5R4 gehts auf jeden Fall. Eventuell auch bei V5R3? Schätze, dass es das viel früher nicht gab.

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Im V5R4-Handbuch ist es noch als "neu" markiert.
    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

  7. #7
    Registriert seit
    Jul 2012
    Beiträge
    4
    Schaut ja echt gut aus, da werde ich mich gleich mal dranmachen.

    Vielen Dank erstmal!

  8. #8
    Registriert seit
    Jan 2007
    Beiträge
    189
    Hier ist was ganz einfaches. Schau mal punkt 3.1 an.
    http://www.sss-software.de/inn/power...erInfo0907.pdf
    mfg

    Kit
    www.ecofitonline.com
    DeskfIT - ChangefIT - XrefIT

  9. #9
    Registriert seit
    Jul 2012
    Beiträge
    4
    Das mit den Descriptoren habe ich schonmal hinbekommen, leider funktioniert das auslesen für numerische Werte nicht - ich empfange nur alpha-Werte.

    Als Datentype erhalte ich '3', wenn ich diesen Wert in ein Feld mit gleichem Typ wie das DB-Feld schiebe erhalte ich SQLError -076 (Datentypen nicht gleich)

    Ich weiss das ist eine Frage die schon sehr ins Detail, habe aber nichts mehr darüber gefunden.

    Danke
    ennsman-

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Je Datentyp solltest du halt unterschiedliche Zielfelder angeben.
    Bei numerisch nimm halt Zoned(31,9), bei gepackt packed(31,9).

    ANsonsten musst du deinen SQL für jedes Feld einen "CHAR(Field)" verwenden, dann castet SQL selber.
    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 2012
    Beiträge
    4
    Ich habe es jetzt nur mit den character-Feldern hinbekommen, aber es läuft.
    Echt praktisch, auch auf das mit dem CASE werde ich sicher noch zurückgreifen können.

    Vielen Dank für eure Hilfe.

    ennsman.

  12. #12
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Ich denke du meinst CAST und nicht CASE.
    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. SQl: select * From(select ...) as Res group By
    By oulbrich in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 12-01-12, 12:58
  2. SQL Select * ... group by
    By DISCOME in forum NEWSboard Programmierung
    Antworten: 14
    Letzter Beitrag: 29-04-11, 07:05
  3. dynamisches Group by funktioniert nicht
    By Tobse77 in forum NEWSboard Programmierung
    Antworten: 12
    Letzter Beitrag: 24-09-09, 08:31
  4. Dynamisches SQL in einem CL erstellen
    By Sony in forum IBM i Hauptforum
    Antworten: 27
    Letzter Beitrag: 20-07-09, 21:48
  5. Dynamisches SQL
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 15-11-05, 11:45

Berechtigungen

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