Aqui está um exemplo completo, baseado na resposta de @Pablo Santa Cruz e no código que você postou.
Não sei por que você recebeu uma mensagem de erro. Provavelmente é um problema com o SQL Developer. Tudo funciona bem quando você o executa no SQL*Plus e adiciona uma função:
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
Mas eu ficaria com
SYS_GUID
se possível. Veja o ID 1371805.1 no My Oracle Support - este bug foi supostamente corrigido em 11.2.0.3. EDITAR
Qual deles é mais rápido depende de como as funções são usadas.
Parece que a versão Java é um pouco mais rápida quando usada em SQL. No entanto, se você for usar essa função em um contexto PL/SQL, a função PL/SQL é cerca de duas vezes mais rápida. (Provavelmente porque evita a sobrecarga de alternar entre os motores.)
Aqui está um exemplo rápido:
--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;
/
Os GUIDs da versão 4 não são completamente aleatória. Alguns dos bytes devem ser corrigidos. Não sei por que isso foi feito ou se isso importa, mas de acordo com https://www.cryptosys.net/pki/uuid-rfc4122.html:
O procedimento para gerar um UUID versão 4 é o seguinte:
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"
Os valores da versão Java parecem estar em conformidade com o padrão.