-
SQL UDF
Hallo zusammen,
ich möchte aus einer Tabelle die letzte höchste Nummer
ermitteln. Dazu soll eine SQL Function dienen.
Hier die Function:
PHP-Code:
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
PHP-Code:
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 ?
-
a) irgendwelche Fehlermeldungen?
b) warum nicht sowas wie:
PHP-Code:
SET ARETURN =
SELECT coalesce(max(H_CARDNR), 0) +1
From appclhp
WHERE H_CARDYY = AYEAR
and H_CARDEML = AEMAIL
-
... 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
-
Hallo,
habe deinen Vorschlag mal umgesetzt:
PHP-Code:
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
PHP-Code:
SQL0104 30 23 Position 31 Token COALESCE ungültig. Gültige Token: ;.
-
Hi zusammen,
so klappt es dann auch mit der Syntax:
PHP-Code:
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
-
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
Similar Threads
-
By Nils_V in forum IBM i Hauptforum
Antworten: 11
Letzter Beitrag: 18-07-16, 09:49
-
By Peder in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 06-12-06, 08:15
-
By jakarto in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 24-07-06, 13:41
-
By HACHIMAN in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 22-05-06, 09:48
-
By SReusch in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 13-01-06, 07:13
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks