-
Fetch klapt nicht
Moin moin,
ich hab nen kleineres Problem. Ich probiere gerade ein wenig mit SQL rum. Ich benötige nach dem löschen eines Datensatzes (mit RPG - Delete) das Endedatum zu einer Saison und das Startdatum der Saison.
Ich habe mir nun eine Anweisung zusammen gebastelt
PHP-Code:
c+ declare c1 cursor for
c+ select BisDatum from Zeitraum where Gebiet = :Zeitraum_Gebiet and
c+ Ort = :Zeitraum_Ort and
c+ Hotel = :Zeitraum_Hotel and
c+ SaisKZ = :Zeitraum_SaisKZ
c+ order by BisDatum desc FETCH FIRST 1 ROW ONLY
und eine zweite wo ich mit Cursor C2 das Von Datum abfrage.
Beide Anweisungen funktionieren auch, ausser wenn ich es direkt nach dem Delete ausführe, dann bringt er mir als Ergebniss das Datum des gerade gelöschten Datensatzes!
Muss ich, bevor ich das Statement ausführe, die Datei einmal schliessen, oder was kann ich da machen?
-
Guten Morgen,
hast du schon mal probiert den Cursor zu vor dem nächsten Fetch zu schließen und anschließend wieder zu öffnen?
Möglicherweise hat dieser den gelöschten Satz noch im Speicher.
-
Ich definiere und öffne den Cursor erst nach der Delete Anweisung, das ist es ja was mich so fuchsig macht .
-
declare cursor wirkt nur zur Compile Zeit, entscheidend ist der open. Wenn der nach dem delete erfolgt und alles wirklich so abläuft wie berichtet (SQL Codes prüfen, wg. der Pferde und der Apotheke), dann ist die Datenbank krank und braucht ein PTF.
D*B
 Zitat von DEVJO
Ich definiere und öffne den Cursor erst nach der Delete Anweisung, das ist es ja was mich so fuchsig macht .
-
Komischerweise ist der SqlCod = 100 (ist das nicht EOF?) was allerdings gar nicht sein kann, da ich weiß (100%) das da noch wenigstens 1 Datensatz vorhanden ist !
Der "Open c1" kommt nach dem "Declare c1" und der wiederum kommt nach dem Delete (in einer SubRoutine).
-
das ist so komisch nicht, der Cursor hat noch den Stand von vor dem Delete, und der Satz ist ja nun wirklich fort...
überprüfe nochmal den Status des Cursors (war der vielleicht noch offen, wurde also vorher geöffnet). Dann leigt ein Fehler in der Datenbank vor.
Als Work around zieht sehr wahrscheinlich den Cursor sensitiv zu machen oder das fetch first row only rauszumachen.
D*B
 Zitat von DEVJO
Komischerweise ist der SqlCod = 100 (ist das nicht EOF?) was allerdings gar nicht sein kann, da ich weiß (100%) das da noch wenigstens 1 Datensatz vorhanden ist !
Der "Open c1" kommt nach dem "Declare c1" und der wiederum kommt nach dem Delete (in einer SubRoutine).
-
Aber wieso hat der Cursor den Stand von vor dem Delete? Wenn ich ihn doch erst danach definiere !
-
Das kann ich nicht machen, weil dann bringt mir die Anweisung ja nichts mehr, brauche halt das niedrigste und höchste Datum. Ich habe jetzt in diesem besonderen Fall einfach noch einen Chain gemacht...... damit klapt es. Ist nicht schön, aber selten
-
der for first row only bei der Deklaration ist lediglich eine Angabe für den Optimizer, Cursor ohne Fetch first und einmal fetch ändert nix an der Logik!
D*B
BTW: den Mix von SQL und RLA, den würde ich eh' bleiben lassen.
 Zitat von DEVJO
Das kann ich nicht machen, weil dann bringt mir die Anweisung ja nichts mehr, brauche halt das niedrigste und höchste Datum. Ich habe jetzt in diesem besonderen Fall einfach noch einen Chain gemacht...... damit klapt es. Ist nicht schön, aber selten 
-
Wo du in der Quelle deine Declare's abgibst ist für die Laufzeit nicht relevant (ausser in einer Prozedur).
Einfacher ist im Übrigen:
c+ select max(BisDatum) from Zeitraum where Gebiet = :Zeitraum_Gebiet and
c+ Ort = :Zeitraum_Ort and
c+ Hotel = :Zeitraum_Hotel and
c+ SaisKZ = :Zeitraum_SaisKZ
Dafür benötigst du noch nicht mal einen Cursor:
c+ select max(BisDatum) into :MyDate
c+ from Zeitraum where Gebiet = :Zeitraum_Gebiet and
c+ Ort = :Zeitraum_Ort and
c+ Hotel = :Zeitraum_Hotel and
c+ SaisKZ = :Zeitraum_SaisKZ
-
der Cursor muss als sensitive deklariert werden, um sicherzustellen, dass er die aktuellen Werte auch nach Änderungen an der Tabelle zwischen open und fetch zurückgibt.
D*B
 Zitat von DEVJO
Moin moin,
ich hab nen kleineres Problem. Ich probiere gerade ein wenig mit SQL rum. Ich benötige nach dem löschen eines Datensatzes (mit RPG - Delete) das Endedatum zu einer Saison und das Startdatum der Saison.
Ich habe mir nun eine Anweisung zusammen gebastelt
PHP-Code:
c+ declare c1 cursor for
c+ select BisDatum from Zeitraum where Gebiet = :Zeitraum_Gebiet and
c+ Ort = :Zeitraum_Ort and
c+ Hotel = :Zeitraum_Hotel and
c+ SaisKZ = :Zeitraum_SaisKZ
c+ order by BisDatum desc FETCH FIRST 1 ROW ONLY
und eine zweite wo ich mit Cursor C2 das Von Datum abfrage.
Beide Anweisungen funktionieren auch, ausser wenn ich es direkt nach dem Delete ausführe, dann bringt er mir als Ergebniss das Datum des gerade gelöschten Datensatzes!
Muss ich, bevor ich das Statement ausführe, die Datei einmal schliessen, oder was kann ich da machen?
Similar Threads
-
By AndreasH in forum IBM i Hauptforum
Antworten: 13
Letzter Beitrag: 08-05-15, 13:09
-
By pedro-zapata in forum NEWSboard Programmierung
Antworten: 6
Letzter Beitrag: 11-09-06, 12:34
-
By linguin in forum IBM i Hauptforum
Antworten: 6
Letzter Beitrag: 04-08-06, 10:38
-
By marcel331 in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 11-04-06, 15:47
-
By zannaleer in forum NEWSboard Programmierung
Antworten: 12
Letzter Beitrag: 30-01-05, 16:51
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