Anmelden

View Full Version : SQL UDF



mk
02-01-12, 14:29
Hallo zusammen,

ich möchte aus einer Tabelle die letzte höchste Nummer
ermitteln. Dazu soll eine SQL Function dienen.

Hier die Function:

CREATE FUNCTION MK/NNR (
AEMAIL CHAR(70) ,
AYEAR CHAR(4 ) )
RETURNS dec (10, 0 )
LANGUAGE SQL

NOT DETERMINISTIC
READS SQL DATA
CALLED ON NULL INPUT
SET OPTION ALWBLK = *ALLREAD ,
ALWCPYDTA = *OPTIMIZE ,
COMMIT = *NONE ,
CLOSQLCSR = *ENDMOD ,
DFTRDBCOL = *NONE ,
DLYPRP = *NO ,
DYNDFTCOL = *NO ,
DYNUSRPRF = *USER ,
RDBCNNMTH = *RUW ,
SRTSEQ = *HEX
BEGIN
DECLARE aReturn DEC ( 10, 0);

CASE
WHEN (
( SELECT COUNT ( * ) FROM APPCLHP
whERE H_CARDEML = AEMAIL
AND H_CARDYY = AYEAR ) > 0 )
THEN
SET ARETURN =
SELECT max(H_CARDNR) +1
From appclhp
WHERE H_CARDYY = AYEAR
and H_CARDEML = AEMAIL ;
WHEN (
( SELECT COUNT ( * ) FROM APPCLHP
whERE H_CARDEML = AEMAIL
AND H_CARDYY = AYEAR ) = 0 )
THEN
SET ARETURN = 1;

END CASE ;
RETURN ARETURN ;
END ;

Die Keyfelder sind

H_CARDEML
H_CARDYY
und werden als Parameter übergeben.

Leider schaffe ich es von der Syntax nicht
das ich die SQL Function erstellen kann.

Hat jemand eine Idee ?

rmittag
02-01-12, 14:50
a) irgendwelche Fehlermeldungen?

b) warum nicht sowas wie:


SET ARETURN =
SELECT coalesce(max(H_CARDNR), 0) +1
From appclhp
WHERE H_CARDYY = AYEAR
and H_CARDEML = AEMAIL

BenderD
02-01-12, 15:01
... der Wert ist dann ein Schätzwert, der bis zumnächsten Insert gilt (commit=none) und mit ausreichendem Commit level sperrt das Teil die ganze Table. Besser ist da schon eine Key Table oder auto Increment Felder...

D*B

mk
02-01-12, 15:11
Hallo,

habe deinen Vorschlag mal umgesetzt:

CREATE FUNCTION MK/NNR (
AEMAIL CHAR(70) ,
AYEAR CHAR(4 ) )
RETURNS dec (10, 0 )
LANGUAGE SQL

NOT DETERMINISTIC
READS SQL DATA
CALLED ON NULL INPUT
SET OPTION ALWBLK = *ALLREAD ,
ALWCPYDTA = *OPTIMIZE ,
COMMIT = *NONE ,
CLOSQLCSR = *ENDMOD ,
DFTRDBCOL = *NONE ,
DLYPRP = *NO ,
DYNDFTCOL = *NO ,
DYNUSRPRF = *USER ,
RDBCNNMTH = *RUW ,
SRTSEQ = *HEX
BEGIN
DECLARE aReturn DEC ( 10, 0);
SET ARETURN =
SELECT coalesce(max(H_CARDNR), 0) +1
From appclhp
WHERE H_CARDYY = AYEAR
and H_CARDEML = AEMAIL ;
RETURN ARETURN ;
END ;

Bei dem RUNSQLSTM kommt der Fehler

SQL0104 30 23 Position 31 Token COALESCE ungültig. Gültige Token: ;.

mk
02-01-12, 15:51
Hi zusammen,

so klappt es dann auch mit der Syntax:

BEGIN
RETURN (
SELECT coalesce(max(H_CARDNR), 0) +1
From appclhp
WHERE H_CARDYY = AYEAR
and H_CARDEML = AEMAIL ) ;
END ;


Vielen Dank für die Informationen

andreaspr@aon.at
02-01-12, 17:49
SET ARETURN = (SELECT coalesce(max(H_CARDNR), 0) +1
From appclhp
WHERE H_CARDYY = AYEAR
and H_CARDEML = AEMAIL);

Du musst das SELECT in Klammern setzen, dann funktioniert es bei SET auch.

lg Andreas