AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Fehler in Firebird SP Language
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler in Firebird SP Language

Ein Thema von dataspider · begonnen am 5. Mai 2023 · letzter Beitrag vom 5. Mai 2023
Antwort Antwort
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#1

Fehler in Firebird SP Language

  Alt 5. Mai 2023, 08:32
Datenbank: Firebird • Version: 3 • Zugriff über: IBExpert
Ich bin jetzt schon einige Male darüber "gestolpert".
Ich habe eine Stored Procedure:

SQL-Code:
create or alter procedure berechne_sachkonto_lbd
as
declare variable id integer$;
declare variable nummer type of dnr;
declare variable datum$ date$;
declare variable datum date$;
begin
  -- letztes Buchungsdatum eintragen
  for select
      k.nummer
    , k.letztes_buchungsdatum
      from sachkonto k
      into
      :nummer
    , :datum$
      as cursor cur
  do
  begin
    datum = null; -- Variable wird nicht NULL, wenn kein Datensatz existiert, sondern behaelt letzten Wert
    select first 1 b.buchungsdatum from kostenbuchung b
           where b.sachkonto = :nummer
           order by b.buchungsdatum desc
           into :datum;
    if (:datum is distinct from :datum$) then
      update sachkonto k
             set k.letztes_buchungsdatum = :datum
             where current of cur;
  end
end
Die Variable Datum wird nur gesetzt, wenn das Statement "select first 1 b.buchungsdatum from kostenbuchung b ..." einen Datensatz findet.
Gibt es keinen Datensatz mit der Bedingung, behält die Variable Datum den letzten Wert bei, wenn ich diese nicht vorher mit NULL initialisiere.
Dadurch stehen in der Tabelle sachkonto dann falsche Werte drin, wenn es gar keinen Buchungssatz gibt.
Deshalb muss ich immer darauf achten, die Variablen vor dem Statement mit NULL zu initialisieren.

Wenn ich ein Select in eine Variable (into :datum) ausführe und das select liefert NULL, dann erwarte ich auch ein NULL in der Variable.

Ich halte das für einen Bug, oder liege ich da falsch.
Sollte ich bei Firebird einen Bug - Eintrag machen?

Danke

Frank
Frank Reim
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.890 Beiträge
 
Delphi 12 Athens
 
#2

AW: Fehler in Firebird SP Language

  Alt 5. Mai 2023, 11:01
Kurz gesagt: Da liegst Du falsch.
Code:
SELECT ... FROM ... WHERE ... INTO
sagt ja aus, dass für jeden ermittelten Wert etwas in die Variable(n) geschrieben werden soll. Wird kein Wert ermittelt, weil das Select kein Ergebnis liefert, wird auch nichts geschrieben.
Würde in dem von Dir beschriebenen Fall die Variable nun auf NULL gesetzt, so würde ich das als einen Fehler ansehen.
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Fehler in Firebird SP Language

  Alt 5. Mai 2023, 11:47
Vielen Dank!

Es ist manchmal nicht so einfach zu verstehen...

Wenn ich das z.B. mit einem Update wie folgt mache:

SQL-Code:
update sachkonto k set
  k.letztes_buchungsdatum = (select first 1 b.buchungsdatum from kostenbuchung b where b.sachkonto = k.nummer order by b.buchungsdatum desc)
dann ersetzt er das Feld letztes_buchungsdatum korrekt mit "NULL", wenn kein Buchungssatz existiert.

Nun muss ich halt aufpassen, dass ich Variablen in Schleifen immer auf null zurücksetze.

Frank Reim
Frank Reim
  Mit Zitat antworten Zitat
Alt 6. Mai 2023, 04:50     Erstellt von monkeymart
Dieser Beitrag wurde von TBx gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Alt 12. Mai 2023, 10:44     Erstellt von dordle12
Dieser Beitrag wurde von TBx gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz