![]() |
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:
Die Variable Datum wird nur gesetzt, wenn das Statement "select first 1 b.buchungsdatum from kostenbuchung b ..." einen Datensatz findet.
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 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 |
AW: Fehler in Firebird SP Language
Kurz gesagt: Da liegst Du falsch.
Code:
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.
SELECT ... FROM ... WHERE ... INTO
Würde in dem von Dir beschriebenen Fall die Variable nun auf NULL gesetzt, so würde ich das als einen Fehler ansehen. |
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:
dann ersetzt er das Feld letztes_buchungsdatum korrekt mit "NULL", wenn kein Buchungssatz existiert.
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) 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