Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да генерирам версия 4 (случаен) UUID на Oracle?

Ето пълен пример, базиран на отговора на @Pablo Santa Cruz и кода, който сте публикували.

Не съм сигурен защо получавате съобщение за грешка. Вероятно е проблем със SQL Developer. Всичко работи добре, когато го стартирате в SQL*Plus и добавите функция:

   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

Но бих се придържал към SYS_GUID ако е възможно. Вижте ID 1371805.1 в My Oracle Support - тази грешка се предполага, че е коригирана в 11.2.0.3.

РЕДАКТИРАНЕ

Кое е по-бързо зависи от това как се използват функциите.

Изглежда, че версията на Java е малко по-бърза, когато се използва в SQL. Ако обаче ще използвате тази функция в PL/SQL контекст, функцията PL/SQL е около два пъти по-бърза. (Вероятно защото се избягват излишните разходи при превключване между двигатели.)

Ето един бърз пример:

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

GUID на версия 4 не са напълно произволен. Някои от байтовете трябва да бъдат фиксирани. Не съм сигурен защо е направено това или дали има значение, но според https://www.cryptosys.net/pki/uuid-rfc4122.html:

Процедурата за генериране на UUID версия 4 е както следва:

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"

Стойностите от версията на Java изглежда отговарят на стандарта.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Правилният начин за предоставяне на достъп на потребителите до допълнителни схеми в Oracle

  2. Добавяне на име на схема към обект в Spring данни?

  3. Свържете своя OEM към Grafana с помощта на приложението Enterprise Manager за Grafana

  4. Защо Mysql's Group By и Oracle's Group по поведение са различни

  5. Объркване с Oracle CONNECT BY