2016-07-21 25 views
0

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:

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).

+0

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

+0

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. –

Antwort

0

Ich bin immer noch nicht sicher, warum NEXT VALUE mit CREATE FUNCTION nicht erlaubt ist, aber nach mustaccio zeigte mir die DIGITS()built-in function ich, dass als Lösung verwenden werden, da es viel sauberer als meine RIGHT()built-in function Nutzung ist.

Erstellen des Sequenzers:

CREATE SEQUENCE someid AS DECIMAL(35) CACHE 100 

Ein Beispiel Nutzung:

VALUES (DIGITS(NEXT VALUE FOR someid)) 

Ergebnis:

"00000000000000000000000000000000001" 
+0

Bitte warten Sie einen Moment: Wofür verwenden Sie diesen Wert? Brauchen Sie eine strikt ansteigende Sequenz ohne Lücken? Dann brauchen Sie nicht nur eine separate Tabelle, es gibt noch einiges mehr, worüber Sie sich Sorgen machen müssen (http://stackoverflow.com/questions/24184749/sql-server-unique-composite-key-of-towel-field-with) -second-field-auto-increment/24196374 # 24196374) (SQL Server, aber das Problem ist universell). Wenn es Ihnen egal ist, was passiert, wenn die db abstürzt oder die Einfügung rückgängig gemacht wird, ist das wahrscheinlich in Ordnung. –

+0

Danke für den Kommentar Uhrwerk-Muse. Wir benötigen keine No-Gap-Sequenz, daher können wir einen Sequenzer verwenden. –