-
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.
-
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.
-
Kann man das im Prepare erzwingen, so das nur Statische Cursor verwendet werden?
-
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)).
-
Genau so ist erdefiniert
Declare CursorName insensitive....
spricht es müsste doch funktionieren oder?
-
Ist auch "ALWCPYDTA(*YES)" definiert ?
Allerdings ist die "Anzahl Sätze" beim Select eigentlich nicht definiert, sondern nur beim Insert/Update.
-
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
-
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.
-
Das hat was mit der SQE zu tun,
denn wenn ich ein UPPER('X') = 'X' in die WHERE einbaue, klappt alles wieder.
-
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).
-
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
-
By loeweadolf in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 04-05-07, 21:06
-
By christian_lettner in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 16-11-06, 10:15
-
By FNeurieser in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 11-10-06, 14:53
-
By Kaufmann in forum IBM i Hauptforum
Antworten: 11
Letzter Beitrag: 28-06-06, 14:11
-
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
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks