[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Jul 2002
    Beiträge
    331

    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?

  2. #2
    Registriert seit
    May 2005
    Beiträge
    103
    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.

  3. #3
    Registriert seit
    Jul 2002
    Beiträge
    331
    Ich definiere und öffne den Cursor erst nach der Delete Anweisung, das ist es ja was mich so fuchsig macht .

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    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 Zitat von DEVJO Beitrag anzeigen
    Ich definiere und öffne den Cursor erst nach der Delete Anweisung, das ist es ja was mich so fuchsig macht .
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  5. #5
    Registriert seit
    Jul 2002
    Beiträge
    331
    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).

  6. #6
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    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 Zitat von DEVJO Beitrag anzeigen
    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).
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  7. #7
    Registriert seit
    Jul 2002
    Beiträge
    331
    Aber wieso hat der Cursor den Stand von vor dem Delete? Wenn ich ihn doch erst danach definiere !

  8. #8
    Registriert seit
    Jul 2002
    Beiträge
    331
    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

  9. #9
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    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 Zitat von DEVJO Beitrag anzeigen
    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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    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
    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
    Mar 2002
    Beiträge
    5.365
    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 Zitat von DEVJO Beitrag anzeigen
    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?
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Similar Threads

  1. Brauche Hilfe zu FETCH xxx USING DESCRIPTOR
    By AndreasH in forum IBM i Hauptforum
    Antworten: 13
    Letzter Beitrag: 08-05-15, 13:09
  2. FETCH n ROws in einzelne Felder einer DS
    By pedro-zapata in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 11-09-06, 12:34
  3. Group und fetch first xx rows
    By linguin in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 04-08-06, 10:38
  4. FETCH INTO Variablen Dynamisch verändern
    By marcel331 in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 11-04-06, 15:47
  5. embedded-SQL fetch über mehrere Dateien
    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
  •