[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Apr 2005
    Beiträge
    385

    Anzahl der Datesätze bei SQLRPGLE

    Hallo zusammen,

    ich mache ein

    SELECT FLD1, FLD2, FLD3 from DAT1 INNER JOIN DAT2 ON FLD2=FLD5

    als dynamischen SQL Statement

    Gibt es irgendwo einen rückkehrcode in der SQLCA wo die Anzahl an ermittelten Sätzen zu finden ist?
    Also 0 oder 4711 -->ein quasi COUNT(*)

    Danke an alle Helfenden.

  2. #2
    Registriert seit
    Jun 2001
    Beiträge
    1.975
    Fetcht du anschl. die Selektion in eine occur-ds?
    Dann steht in sqlerrorcode5 (glaube ich, lange nicht mehr verwendet) die Anzahl tatsächlicher Sätze.

    Hmm..
    Irgendwie ist mir nicht ganz klar was genau du machst?

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

  3. #3
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Habs zwar jetzt nicht getestet, sollte aber mit der Get Diagnostics auch möglich sein.

    Code:
    Exec Sql Get Diagnostics :count = DB2_NUMBER_ROWS;
    lg Andreas

  4. #4
    Registriert seit
    Apr 2005
    Beiträge
    385
    Also die ermittelten Sätze schiebe ich in eine OCCUR-DS.

    Ich würde die Anzahl aber gerne haben um eine Info auszugeben, "Es wurden xxxx Sätze ermittelt."

    Desweiteren wenn es über 10000 sein sollten, dann auch noch bescheid geben, das nicht alle Sätze angezeigt werden können.

    Also nicht dramatischem, werde beide Lösungen mal probieren und dann berichten

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.245
    Der Select kann die Anzahl der Sätze leider nicht übergeben.
    Diagnostics liefert auch nur bei Update/Delete die Anzahl der Sätze.

    Möchtest du die Anzahl vorher wissen dann geht das auch dynamsich:

    select count(*) as counter from
    ( fullselect )

    Zu bedeneken ist hier lediglich, dass bei Tablescans die Abfragedauer dann verdoppelt wird!
    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
    Aug 2003
    Beiträge
    1.508
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Diagnostics liefert auch nur bei Update/Delete die Anzahl der Sätze.
    Das stimmt nicht ganz. Das was du meinst ist der Parameter ROW_COUNT. Bei DB2_NUMBER_ROWS wird die anzahl der Sätze der Result Table zurückgegeben (Bei Open und Fetch)

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.245
    OK, das hängt aber nun doch sehr stark vom verwendeten Select und Cursor-Type ab.
    Nur wenn SQL alle Sätze tatsächlich gelesen hat (kein Index für Sortierfolge), der Cursor insensitive ist, o.ä. könnte da ein gültiger Wert drinstehen.


    DB2_NUMBER_ROWS
    If the previous SQL statement was an OPEN or a FETCH which caused the size of the result table to be known, returns the number of rows in the result table. For SENSITIVE cursors, this value can be thought of as an approximation since rows inserted and deleted will affect the next retrieval of this value. If the previous statement was a PREPARE statement, returns the estimated number of rows in the result table for the prepared statement. Otherwise, the value zero is returned.
    Also wirklich verlassen würde ich mich nicht darauf.
    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
    Aug 2003
    Beiträge
    1.508
    Zitat Zitat von Fuerchau Beitrag anzeigen
    OK, das hängt aber nun doch sehr stark vom verwendeten Select und Cursor-Type ab.
    Nur wenn SQL alle Sätze tatsächlich gelesen hat (kein Index für Sortierfolge), der Cursor insensitive ist, o.ä. könnte da ein gültiger Wert drinstehen.
    Ich hab das Gefühl du suchst einen Grund das nicht verwenden zu können

    *) Auch WENN die Engine einen Index für Sortierung verwendet steht da ein gültiger Wert drinnen. Wo hast du das denn gelesen??

    *) Auch WENN der Cursor SENSITIVE ist, steht da ein gültiger Wert drinnen (zum Zeitpunkt zu dem das Result-Set aufgebaut wurde!!).
    Vor dem gleichen Problem stehst du beim
    select count(*) as counter from
    ( fullselect )
    Bzw. weist du bei dem count(*) noch weniger ob dein Result-Set danach dem entspricht was du vorher gelesen hast, da sich die Tabelle zwischen den beiden Statements schon längst geändert haben könnte. Also GERADE in solch einen Fall ist die Methode mit GET DIAGNOSTICS die Bessere!!!

  9. #9
    Registriert seit
    Jun 2001
    Beiträge
    1.975
    hab mich vertan, gem. meiner alten doku, ist es sqlerrcode(3), nicht 5

    Ohne es probiert zu haben

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

  10. #10
    Registriert seit
    Aug 2001
    Beiträge
    2.875
    Zitat Zitat von Robi Beitrag anzeigen
    hab mich vertan, gem. meiner alten doku, ist es sqlerrcode(3), nicht 5

    Ohne es probiert zu haben

    Robi
    SQLER3 oder SQLERRCODE(3) gibt die Anzahl der Datensätze an, die bei einem Multiple-Row-Fetch ausgegeben werden oder, die bei einem Insert, Update oder Delete (ohne Cursor) hinzugefügt, geändert oder gelöscht wurden.
    Entspricht dem Schlüssel-Wort ROW_COUNT, das von einem GET DIAGNOSTICS-Statement ausgegeben werden kann.

    SQLER5 order SQLERRCODE(5) gibt an, ob bei einem Multiple Row Fetch noch weitere Zeilen vorhanden sind, d.h. wird 100 ausgegeben, gibt es keine weiteren Zeilen.
    SQLER5 entspricht dem Schlüssel-Wort DB2_LAST_ROW, das von einem GET DIAGNOSTICS Statement ausgegeben werden kann.

    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

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.245
    Da kann ich nur Birgitta zustimmen.
    Auch SQL weiß erst wieviele Daten tatsächlich gelesen werden, wenn der letzte Fetch erfolgt ist.

    Mache ich einen Single-Fetch bekomme ich 1 zurück, Multiple-Row die Anzahl Strukturen.

    Bei veränderbaren Daten ist natürlich ein Count(*) auch nur eine Abschätzung.
    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
    Apr 2005
    Beiträge
    385
    Also nach den ersten Stichrobenartigen Select' kommt beim Tipp vom Robi immer die richtige Anzahl herraus! Ob das immer so ist, kann ich bislang auch nicht sagen.

    Danke erstmal an alle!

Similar Threads

  1. sql Anzahl Datensätze in Zweit-Datei
    By rr2001 in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 13-12-06, 14:04
  2. Anzahl Felder in Displayfile
    By steven_r in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 07-11-06, 11:01
  3. Anzahl gelöschter Datensätze in PF
    By Der_Unwissende in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 20-10-06, 08:32
  4. Anzahl angemeldeter User auf der AS400
    By Bratmaxxe in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 29-06-06, 10:29
  5. Einschränkungen in der Anzahl der parallelen Jobs
    By Christian.Hesse in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 04-04-06, 11:59

Berechtigungen

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