sql >> Database teknologi >  >> RDS >> Oracle

Hvordan genererer man en version 4 (tilfældig) UUID på Oracle?

Her er et komplet eksempel baseret på @Pablo Santa Cruz' svar og den kode, du har sendt.

Jeg er ikke sikker på, hvorfor du fik en fejlmeddelelse. Det er sandsynligvis et problem med SQL Developer. Alt fungerer fint, når du kører det i SQL*Plus og tilføjer en funktion:

   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
 

Men jeg ville holde mig til SYS_GUID hvis det er muligt. Se på ID 1371805.1 på My Oracle Support - denne fejl er angiveligt rettet i 11.2.0.3.

REDIGER

Hvilken der er hurtigst afhænger af, hvordan funktionerne bruges.

Det ser ud til, at Java-versionen er lidt hurtigere, når den bruges i SQL. Men hvis du skal bruge denne funktion i en PL/SQL-sammenhæng, er PL/SQL-funktionen cirka dobbelt så hurtig. (Sandsynligvis fordi det undgår overhead ved at skifte mellem motorer.)

Her er et hurtigt eksempel:

--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; /

Version 4 GUID'er er ikke helt tilfældig. Nogle af bytes formodes at være rettet. Jeg er ikke sikker på, hvorfor dette blev gjort, eller om det betyder noget, men ifølge https://www.cryptosys.net/pki/uuid-rfc4122.html:

Proceduren for at generere et version 4 UUID er som følger:

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"
 

Værdierne fra Java-versionen ser ud til at være i overensstemmelse med standarden.



  1. Omdøb en kolonne i MySQL

  2. ASCII()-funktion i Oracle

  3. DateTime2 vs DateTime i SQL Server

  4. SQL Server AlwaysOn ( Availability Group ) Arkitektur og trin for trin installation -2