Anzeiger-Variable meint meist, dass ein NULL-Wert irgendwo verwendet oder verglichen wird. Geprüft werden NULL-Werte i.d.R. über Anzeiger-Variablen.
Wo berechnest Du eigentlich Preis2?
Soweit ich das sehen kann nirgends. Preis2 wird mit einem NULL-Wert inititalisiert und anschließend wird dieser NULL-Wert mit 0 verglichen (IF Preis2 > 0) und das funktioniert nicht.
1. Initialisiere alle deklarierte Variablen
2. Anstatt das numerische Tagesdatum in den Cursorn zu berechnen würde ich eine separate variable definieren und nur einmalig initialisieren.
3. Anstatt der Cursor mit For-Schleifen würde ich ein einfaches SELECT ... INTO verwenden.
4. Sicherheitshalber würde ich den Preis über COALESCE in einen Default-Wert (z.B. 0) konvertieren.
Etwa so:
Code:
CREATE FUNCTION rptrade/artpreis3 ( ARTIKELNR dec(10),
Kundennr dec(10) )
RETURNS CHAR(10)
LANGUAGE SQL
READS SQL DATA
BEGIN
DECLARE RETURNVAL CHAR ( 10 ) NOT NULL DEFAULT '0,00' ;
DECLARE preis1 dec ( 10, 0 ) NOT NULL Default 0;
DECLARE Preis2 dec ( 10, 0 ) Not NULL Default 0;
Declare DateNum Dec( 8, 0 ) Not NULL Default 0;
Set DateNum = Dec(VarChar_Format(Current_Timestamp, 'YYYYMMDD'), 8, 0);
Select Coalesce(SOEIPR, 0) into Preis1
From RPTRADE/ArtPreis1
Where SOID2 = ARTIKELNR
and ( sodnbi = 99999999
or sodnbi >= DateNum)
order by sodnbi desc
fetch first row only;
Select Coalesce(SOEIPR, 0) into Preis2
From RPTRADE/ArtPreis2
where SOID4 = ARTIKELNR
and soid1 = kundennr
and ( sodnbi = 99999999
or sodnbi >= DateNum)
order by sodnbi desc
fetch first row only;
if Preis2 > 0 then set preis1 = Preis2;
end if ;
SET RETURNVAL = cast(preis1 as char(10));
RETURN LTRIM(RETURNVAL) ;
END
Birgitta
Bookmarks