Anmelden

View Full Version : Fetch klapt nicht



Seiten : [1] 2

DEVJO
27-04-09, 10:17
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

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?

Tobse77
27-04-09, 10:24
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.

DEVJO
27-04-09, 10:27
Ich definiere und öffne den Cursor erst nach der Delete Anweisung, das ist es ja was mich so fuchsig macht .

BenderD
27-04-09, 10:29
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


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

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?

BenderD
27-04-09, 10:34
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


Ich definiere und öffne den Cursor erst nach der Delete Anweisung, das ist es ja was mich so fuchsig macht .

DEVJO
27-04-09, 10:42
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).

BenderD
27-04-09, 10:54
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


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).

DEVJO
27-04-09, 11:05
Aber wieso hat der Cursor den Stand von vor dem Delete? Wenn ich ihn doch erst danach definiere !

DEVJO
27-04-09, 11:11
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 :)

BenderD
27-04-09, 12:00
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.


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 :)