Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Fehler in Firebird SP Language (https://www.delphipraxis.net/212995-fehler-firebird-sp-language.html)

dataspider 5. Mai 2023 07:32

Datenbank: Firebird • Version: 3 • Zugriff über: IBExpert

Fehler in Firebird SP Language
 
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

TBx 5. Mai 2023 10:01

AW: Fehler in Firebird SP Language
 
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.

dataspider 5. Mai 2023 10:47

AW: Fehler in Firebird SP Language
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz