sql >> Databasteknik >  >> RDS >> Oracle

Hur genererar man ett version 4 (slumpmässigt) UUID på Oracle?

Här är ett komplett exempel, baserat på @Pablo Santa Cruz svar och koden du postade.

Jag är inte säker på varför du fick ett felmeddelande. Det är förmodligen ett problem med SQL Developer. Allt fungerar bra när du kör det i SQL*Plus och lägger till 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 jag skulle hålla mig till SYS_GUID om möjligt. Titta på ID 1371805.1 på My Oracle Support - det här felet är förmodligen fixat i 11.2.0.3.

REDIGERA

Vilken som är snabbast beror på hur funktionerna används.

Det ser ut som att Java-versionen är något snabbare när den används i SQL. Men om du ska använda den här funktionen i ett PL/SQL-sammanhang är PL/SQL-funktionen ungefär dubbelt så snabb. (Förmodligen för att det undviker omkostnader för att växla mellan motorer.)

Här är ett snabbt exempel:

--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 är inte helt slumpmässig. Vissa av byten ska vara fixade. Jag är inte säker på varför detta gjordes, eller om det spelar någon roll, men enligt https://www.cryptosys.net/pki/uuid-rfc4122.html:

Proceduren för att generera ett version 4 UUID är som följer:

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ärdena från Java-versionen verkar överensstämma med standarden.



  1. Att få resultatet av dynamisk SQL till en variabel för sql-server

  2. Hur man fyller ett nummer med ledande nollor i MariaDB

  3. Lagrad procedur och behörigheter - räcker det med EXECUTE?

  4. Hur kan jag korrigera MySQL Load Error