Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana cara menghasilkan UUID versi 4 (acak) di Oracle?

Berikut contoh lengkapnya, berdasarkan jawaban @Pablo Santa Cruz dan kode yang Anda posting.

Saya tidak yakin mengapa Anda mendapat pesan kesalahan. Ini mungkin masalah dengan Pengembang SQL. Semuanya berfungsi dengan baik saat Anda menjalankannya di SQL*Plus, dan menambahkan fungsi:

   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

Tapi saya akan tetap menggunakan SYS_GUID jika memungkinkan. Lihat ID 1371805.1 pada Dukungan Oracle Saya - bug ini seharusnya diperbaiki di 11.2.0.3.

EDIT

Mana yang lebih cepat tergantung pada bagaimana fungsi tersebut digunakan.

Sepertinya versi Java sedikit lebih cepat saat digunakan dalam SQL. Namun, jika Anda akan menggunakan fungsi ini dalam konteks PL/SQL, fungsi PL/SQL sekitar dua kali lebih cepat. (Mungkin karena menghindari overhead peralihan antar mesin.)

Berikut ini contoh singkatnya:

--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 versi 4 tidak sepenuhnya acak. Beberapa byte seharusnya diperbaiki. Saya tidak yakin mengapa ini dilakukan, atau apakah itu penting, tetapi menurut https://www.cryptosys.net/pki/uuid-rfc4122.html:

Prosedur untuk menghasilkan UUID versi 4 adalah sebagai berikut:

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"

Nilai dari versi Java tampaknya sesuai dengan standar.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konfigurasi sumber data Oracle untuk Spring

  2. Fungsi ASIN() di Oracle

  3. ORACLE 11g case tidak sensitif secara default

  4. Membuat Tabel Sementara Global di Oracle

  5. _gc_fusion_compression