Anmelden

View Full Version : SQL Funktion liefert falsches Ergebnis



Seiten : [1] 2

Albert Mayr
16-01-13, 10:14
Ich verwende folgende Funktion zur Ermittlung von Warengruppen:

CREATE FUNCTION SWGWA.GetWagrString (
PARFir Char(3), PARKdnr Char(8) )
RETURNS VARCHAR(1024)
LANGUAGE SQL
NOT DETERMINISTIC
READS SQL DATA
CALLED ON NULL INPUT
BEGIN
DECLARE RETURNVAL VARCHAR ( 1024 ) NOT NULL DEFAULT ' ' ;
FOR CSRC1 AS C1 CURSOR
FOR SELECT wagr
FROM SWKWS
WHERE FIR = PARFir
and KDNR = ParKdnr
DO SET ReturnVal = ReturnVal CONCAT '\' CONCAT trim(CsrC1.wagr);
END FOR ;
RETURN LTRIM(ReturnVal) ;
END;

Der Testaufruf bringt aber einen leeren Rückgabewert:
-- Test
select distinct
fir, kdnr, swgwa.GetWagrString(fir, kdnr) as Warengruppen
from swgwa.swkds
where fir='001' and kdnr='010446';;

-- Ergebnis:
Firma Kunde WARENGRUPPEN
001 010446
******** Datenende ********

Wenn ich die Werte direkt mit Select auswähle, bekomme ich aber ein richtiges Ergebnis:
SELECT wagr FROM SWKWS WHERE FIR='001' and KDNR = '010446';;

Wgr
S
SA
W
******** Datenende ********


Woran kann das liegen?

Vielen Dank für eure Hilfe

mk
16-01-13, 10:21
Hi,

werden bei der Übergabe der Parameter auch alle Stellen gefüllt ?

evtl. ein Trim auf die Input Variablen machen
PARFir , ParKdnr

gruß
Michael

andreaspr@aon.at
16-01-13, 10:37
Probier mal folgendes:

DO SET ReturnVal = trim (ReturnVal) CONCAT '\' CONCAT trim(CsrC1.wagr);

lg Andreas

Fuerchau
16-01-13, 10:53
Warum so kompliziert?
Du brauchst keinen Cursor:

return (select ....);

B.Hauser
16-01-13, 11:14
Return SELECT gibt eine Tabelle zurück!
Das heißt Äpfel mit Birnen zu vergleichen!

Die Funktion jedoch verknüpft die einzelnen Warengruppen zu einem einzigen String und gibt diesen String zurück!

Gibt es bei der Ausführung irgendwelche Fehlermeldungen im Joblog? Am besten Du führst vor Ausführung des SQL Statements zunächst einen STRDBG (ohne weitere Parameter-Übergabe) aus und schaust dann ins Joblog.

Birgitta

Fuerchau
16-01-13, 14:43
Ich meine ja auch nicht die Tabelle sondern das ergebnis analog eines Singlesubselects:

return (
(select abc concat def from mytable where ...)
)

Albert Mayr
17-01-13, 12:38
Der Hinweis von mk mit dem Trim in der Funktion war die Lösung:

... WHERE FIR = trim(PARFir)
and KDNR = trim(ParKdnr)
...

Danke an euch alle

Fuerchau
17-01-13, 15:28
Dass der Trim von Erfolg gekrönt wird spricht gegen eine korrekte Parameterübergabe. Wenn diese ohne führende Leerzeichen erfolgt dann muss es auch ohne klappen da Leerzeichen am Ende nicht relevant sind.

Aber ein scalarer Subselect wäre trotzdem einfacher.

B.Hauser
18-01-13, 06:55
Aber ein scalarer Subselect wäre trotzdem einfacher.

Das musst Du mal erklären, wie Du mit einem skalaren Subselect die Warengruppen über mehrere (unbestimmt viele) Zeilen als String verknüpfen und dann ausgeben willst!

Birgitta

Fuerchau
18-01-13, 08:38
Ja OK, das habe ich dann doch überlesen.
Aber gabs da nicht was mit recursiver CTE in einem anderen Beitrag?