So erzeugen Sie eine version 4 (random) UUID auf Oracle?
Diesem blog erklärt, dass der Ausgang der sys_guid()
ist nicht zufällig für jedes system:
http://feuerthoughts.blogspot.de/2006/02/watch-out-for-sequential-oracle-guids.html
Leider habe ich solch ein system.
Wie zu gewährleisten, um eine zufällige UUID? Ist es möglich mit sys_guid()
? Wenn nicht, wie zuverlässig erhalten eine zufällige UUID auf Oracle?
InformationsquelleAutor der Frage ceving | 2012-12-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein vollständiges Beispiel, basierend auf dem @Pablo, Santa Cruz, die Antwort und den code, den Sie geschrieben.
Ich bin mir nicht sicher, warum Sie eine Fehlermeldung. Es ist vermutlich ein Problem mit dem SQL Developer. Alles funktioniert gut, wenn Sie es ausführen in SQL*Plus und fügen Sie eine Funktion hinzu:
Aber ich würde stick mit
SYS_GUID
wenn möglich. Blick auf ID 1371805.1 auf My Oracle Support - dieser Fehler ist angeblich behoben in 11.2.0.3.BEARBEITEN
Welche schneller ist hängt davon ab, wie die Funktionen verwendet werden.
Sieht es aus wie die Java-version ist etwas schneller, wenn verwendet, in SQL. Allerdings, wenn Sie gehen, um diese Funktion zu verwenden, die in einem PL/SQL-Kontext, die PL/SQL-Funktion über
doppelt so schnell. (Wahrscheinlich, weil es vermeidet overhead wechseln zwischen Motoren.)
Hier ein kurzes Beispiel:
Version 4 GUIDs sind nicht komplett zufällig. Einige bytes werden sollen behoben werden. Ich bin mir nicht sicher, warum dies getan wurde, oder wenn es darauf ankommt, aber nach https://www.cryptosys.net/pki/uuid-rfc4122.html:
Werden die Werte aus der Java-version erscheinen, die dem standard entsprechen.
InformationsquelleAutor der Antwort Jon Heller
https://stackoverflow.com/a/10899320/1194307
Folgende Funktion sys_guid() auf und wandeln es in uuid format:
Es müssen nicht erstellen dbms_crypto package und es gewähren.
InformationsquelleAutor der Antwort lonecat
Benutze ich das jetzt als workaround:
Erfordert die Funktion
dbms_crypto
undutl_raw
. Beide erfordern eine execute-grant.InformationsquelleAutor der Antwort ceving
Schreiben Sie eine Java-Prozedur und kompilieren Sie es und führen es in Oracle. In diesem Verfahren, die Sie verwenden können:
Generieren gewünschten Wert.
Hier ein link, wie zum kompilieren von java-Prozeduren in Oracle.
InformationsquelleAutor der Antwort Pablo Santa Cruz
Es nicht eindeutig sein kann, sondern erzeugen eine "GUID-wie" zufällige Zeichenfolge:
Angepasst aus Quelle von DBMS_RANDOM.STRING.
InformationsquelleAutor der Antwort marciel.deg
Der einfachste und kürzeste Weg, um eine Java-basierte Funktion für mich war:
Kann ich nicht ganz verstehen, warum es nicht kompiliert wenn ich
.toString()
obwohl.InformationsquelleAutor der Antwort Derp
Laut UUID, Version 4 format xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx. @lonecat Antwort bieten dieses format, auch @ceving Antwort teilweise bieten-version-4-Anforderungen. Fehlt ein Teil ist das format y, y sollte einer von 8, 9, a oder b.
Nach dem mischen werden diese Antworten und fixieren der y-Teil, der code sieht wie folgt aus:
InformationsquelleAutor der Antwort Uğur Yeşilyurt
Akzeptiert Antwort von ceving im Widerspruch mit RFC4122: die beiden höchstwertigen bits (bits 6 und 7) der clock_seq_hi_and_reserved sollte so eingestellt sein, null und eins, respectively. Das macht y entspricht 8,9,a oder b im bereits erwähnten von uğur-yeşilyurt format xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
Meine Lösung aus point blank zusammen RFC:
EDIT:
Obwohl die erste Implementierung einfach zu verstehen ist es eher ineffizient. Nächste Lösung ist 3 bis 4 mal schneller.
Dieser test demostrates, dass random_uuid dauert etwa eine Millisekunde und random_uuid2 nur 250 Mikrosekunden. Verkettung in der ersten version verbraucht zu viel Zeit;
InformationsquelleAutor der Antwort Leonid