Hier ist ein vollständiges Beispiel, das auf der Antwort von @Pablo Santa Cruz und dem von Ihnen geposteten Code basiert.
Ich bin mir nicht sicher, warum Sie eine Fehlermeldung erhalten haben. Es ist wahrscheinlich ein Problem mit SQL Developer. Alles funktioniert gut, wenn Sie es in SQL*Plus ausführen und eine Funktion hinzufügen:
create or replace and compile
java source named "RandomUUID"
as
public class RandomUUID
{
public static String create()
{
return java.util.UUID.randomUUID().toString();
}
}
/
Java created.
CREATE OR REPLACE FUNCTION RandomUUID
RETURN VARCHAR2
AS LANGUAGE JAVA
NAME 'RandomUUID.create() return java.lang.String';
/
Function created.
select randomUUID() from dual;
RANDOMUUID() -------------------------------------------------------------- 4d3c8bdd-5379-4aeb-bc56-fcb01eb7cc33
Aber ich würde bei SYS_GUID
bleiben wenn möglich. Sehen Sie sich ID 1371805.1 auf My Oracle Support an - dieser Fehler wurde angeblich in 11.2.0.3 behoben.
BEARBEITEN
Welche schneller ist, hängt davon ab, wie die Funktionen verwendet werden.
Es sieht so aus, als ob die Java-Version etwas schneller ist, wenn sie in SQL verwendet wird. Wenn Sie diese Funktion jedoch in einem PL/SQL-Kontext verwenden, ist die PL/SQL-Funktion etwa doppelt so schnell. (Wahrscheinlich, weil es den Aufwand für das Umschalten zwischen Engines vermeidet.)
Hier ist ein kurzes Beispiel:
--Create simple table
create table test1(a number);
insert into test1 select level from dual connect by level <= 100000;
commit;
--SQL Context: Java function is slightly faster
--
--PL/SQL: 2.979, 2.979, 2.964 seconds
--Java: 2.48, 2.465, 2.481 seconds
select count(*)
from test1
--where to_char(a) > random_uuid() --PL/SQL
where to_char(a) > RandomUUID() --Java
;
--PL/SQL Context: PL/SQL function is about twice as fast
--
--PL/SQL: 0.234, 0.218, 0.234
--Java: 0.52, 0.515, 0.53
declare
v_test1 raw(30);
v_test2 varchar2(36);
begin
for i in 1 .. 10000 loop
--v_test1 := random_uuid; --PL/SQL
v_test2 := RandomUUID; --Java
end loop;
end;
/
GUIDs der Version 4 sind nicht vollständig zufällig. Einige der Bytes sollen repariert werden. Ich bin mir nicht sicher, warum dies getan wurde oder ob es wichtig ist, aber laut https://www.cryptosys.net/pki/uuid-rfc4122.html:
Das Verfahren zum Generieren einer UUID der Version 4 ist wie folgt:
Generate 16 random bytes (=128 bits)
Adjust certain bits according to RFC 4122 section 4.4 as follows:
set the four most significant bits of the 7th byte to 0100'B, so the high nibble is "4"
set the two most significant bits of the 9th byte to 10'B, so the high nibble will be one of "8", "9", "A", or "B".
Encode the adjusted bytes as 32 hexadecimal digits
Add four hyphen "-" characters to obtain blocks of 8, 4, 4, 4 and 12 hex digits
Output the resulting 36-character string "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
Die Werte aus der Java-Version scheinen dem Standard zu entsprechen.