Ich habe versucht, eine Funktion zu erstellen, die einen Sequenzer verwendet, um eine neue Zeichen-ID zurückzugeben. Es scheint jedoch, dass DB2 dies in CREATE FUNCTION-Anweisungen nicht erlaubt. Ich kämpfe, um zu verstehen, warum sie das tun würde, die einzige Dokumentation sie darauf haben, ist:Warum ist NEXT VALUE in CREATE FUNCTION-Anweisungen nicht erlaubt?
NEXT VALUE und PREVIOUS VALUE Ausdrücke können nicht (SQLSTATE 428F9) in folgenden Orten angegeben werden:
- ...
- Anweisung CREATE FUNCTION
- ... https://www.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.sql.ref.doc/doc/r0023464.html
Gibt es einen alternativen Weg, um das Folgende zu erreichen, das threadsicher und nicht verarbeitungsintensiv ist?
CREATE SEQUENCE qgpl.someid AS BIGINT CACHE 100;
Und die Funktion:
CREATE OR REPLACE FUNCTION qgpl.GetNextMandateNumber()
RETURNS CHAR(35)
BEGIN
RETURN RIGHT('00000000000000000000000000000000000' ||
VARCHAR(NEXT VALUE FOR qgpl.someid), 35);
END;
Die beste Alternative ich dachte wäre eine zusätzliche Tabelle zu haben, die die aktuelle Sequenznummer enthalten wird. Und dann passen Sie einfach die Funktion an, um diese anstelle des Sequenzers zu verwenden (ich würde den aktuellen Wert unter Lesen der Stabilitätsisolierungsstufe auswählen, um sicherzustellen, dass es Multi-Thread-sicher ist).
Gibt es einen Grund, warum Sie nicht die verketteten Ausdruck verwenden können sich überall dort, wo Sie geplant um deine Funktion aufzurufen? Haben Sie die [eingebaute Funktion 'DIGITS()'] gesehen? (Https://www.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.sql.ref.doc/doc/ r0000795.html), übrigens? – mustaccio
Ich könnte es verwenden, wo wir den Sequenzer verwenden, aber ich war nicht glücklich mit dem sperrigen RECHTEN BiF überall dort, wo wir das verwenden. Wie auch immer, ich wusste nichts über die DIGITS-Funktion, es ist eine viel bessere Art, es zu tun. Danke für die Information. Ich werde das verwenden, um mein Problem zu lösen. –