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