[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Sep 2004
    Beiträge
    136

    SQL und ihre SQLCA in V5R4

    Hallo,

    wir haben einige Programme, in denen ein SQL Cursor erstellt wird. Nach dem Open, war es bisher immer so, das in der SQLCA im SQLERRD(2) die Anzahl der Zeilen des Cursors enthalten war. Das ist jetzt auch noch ab und an so, aber manchmal ist der Cursor mit Daten gefüllt, jedoch im SQLERRD(2) steht 0 drin.

    Gleiches Programm auf V5R3 macht diese Mucken nicht.

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Das hängt immer von der Art des Cursors ab.
    Bei statischen Cursorn kann die Anzahl geliefert werden, bei dynamischen eben nicht (kann sich ja beim vorwärts/rückwärts lesen ändern).

    V5R4 scheint da beim Optimizer wohl eher dynamische als statische Cursor zu 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
    Sep 2004
    Beiträge
    136
    Kann man das im Prepare erzwingen, so das nur Statische Cursor verwendet werden?

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Declare CursorName insensitive ...

    ASENSITIVE, SENSITIVE,
    or INSENSITIVE Specifies whether the cursor is asensitive, sensitive, or insensitive to changes. ASENSITIVE Specifies that the cursor may behave as SENSITIVE or INSENSITIVE depending on how the select-statement is optimized. This is the default. SENSITIVE Specifies that changes made to the database after the cursor is opened are visible in the result table. The cursor has some level of sensitivity to any updates or deletes made to the rows underlying its result table after the cursor is opened. The cursor is always sensitive to positioned updates or deletes using the same cursor. Additionally, the cursor can have sensitivity to changes made outside this cursor. If the database manager cannot make changes visible to the cursor, then an error is returned. The database manager cannot make changes visible to the cursor when the cursor implicitly becomes read-only. (See "Result table of a cursor" on page 744.) INSENSITIVE Specifies that once the cursor is opened, it does not have sensitivity to inserts, updates, or deletes performed by this or any other activation group. If INSENSITIVE is specified, the cursor is read-only and a temporary result is created when the cursor is opened. In addition, the SELECT statement cannot contain a FOR UPDATE clause and the application must allow a copy of the data (ALWCPYDTA(*OPTIMIZE) or ALWCPYDTA(*YES)).

    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
    Sep 2004
    Beiträge
    136
    Genau so ist erdefiniert
    Declare CursorName insensitive....

    spricht es müsste doch funktionieren oder?

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Ist auch "ALWCPYDTA(*YES)" definiert ?

    Allerdings ist die "Anzahl Sätze" beim Select eigentlich nicht definiert, sondern nur beim Insert/Update.
    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
    Aug 2001
    Beiträge
    2.873
    Hallo,

    hast Du eigentlich schon versucht die Anzahl Sätze über GET DIAGNOSTICS unmittelbar nach dem OPEN zu ermitteln?

    PHP-Code:
    EXEC SQL  GET DIAGNOSTICS :MyVar DB2_NUMBER_ROWS
    Aber vermutlich führt dies zum gleichen Ergebnis wie SQLERR2.

    SQL Reference:
    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.
    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

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Vielleicht arbeitet der Optimizer von V5R4 besser als früher ?
    Ggf. hast du aus Performancegründen einen Index angelegt, so dass SQL diesen nutzt und deshalb nicht weiß, wieviele Sätze denn kommen werden.

    Wenn der Optimizer es nicht für nötig hält, die Daten zu kopieren, kann er auch die Anzahl nicht liefern.
    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

  9. #9
    Registriert seit
    Sep 2004
    Beiträge
    136
    Das hat was mit der SQE zu tun,
    denn wenn ich ein UPPER('X') = 'X' in die WHERE einbaue, klappt alles wieder.

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Was wahrscheinlich sogar auf die Performance geht.
    Durch diese Ergänzung werden wahrscheinlich die Daten wieder kopiert.
    Bei kleinen Ergebnistabellen mag das ja noch Sinn machen.
    Aber bei großen Datenmengen wirds da eher Probleme bereiten.

    Naja, wie gesagt, beim Select habe ich mich noch nie auf die Anzahl verlassen, wenn ich sie nicht selber gezählt habe oder vorher einen COUNT(*) gemacht habe.

    Zur Hilfestellung habe ich auch folgendes durchgeführt:

    with
    MyTemp as (select .....)
    ,MyCount as (select count(*) as xCount from MyTemp)
    select * from MyTemp, MyCount

    So habe ich in jedem Satz die Gesamtanzahl Sätze (was mit unter auch zu Berechnungen innerhalb SQL manchmal Sinn macht).
    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
    Sep 2004
    Beiträge
    136
    Das wäre auch nur ein Lösung für Arme, ich wollte nur wissen wieso es auf einmal nicht mehr funktioniert. Ich werde um den count nicht herum kommen.

Similar Threads

  1. merkwürdig .... SQL RPF Farbe V5R4
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 04-05-07, 21:06
  2. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 10:15
  3. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 14:53
  4. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 14:11
  5. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43

Berechtigungen

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