sql >> データベース >  >> RDS >> Oracle

Oracleでバージョン4(ランダム)UUIDを生成するにはどうすればよいですか?

    @Pablo Santa Cruzの回答と投稿したコードに基づいた、完全な例を次に示します。

    エラーメッセージが表示された理由がわかりません。これはおそらくSQLDeveloperの問題です。 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を使用します。 もし可能なら。 MyOracleSupportのID1371805.1を見てください。このバグは11.2.0.3で修正されていると思われます。

    編集

    どちらが速いかは、関数の使用方法によって異なります。

    SQLで使用すると、Javaバージョンの方がわずかに高速であるように見えます。ただし、この関数をPL / SQLコンテキストで使用する場合、PL/SQL関数の速度は約2倍になります。 (おそらく、エンジン間の切り替えのオーバーヘッドを回避するためです。)

    簡単な例を次に示します。

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

    バージョン4のGUIDは完全にではありません ランダム。一部のバイトは固定されているはずです。なぜこれが行われたのか、またはそれが重要かどうかはわかりませんが、https://www.cryptosys.net/pki/uuid-rfc4122.htmlによると:

    バージョン4のUUIDを生成する手順は次のとおりです。

    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. CASEおよびINによる更新-Oracle

    2. SQLテーブルの重複レコードを削除するためのストアドプロシージャ

    3. SQL Serverトリガーは、新しい行から別のテーブルに値を挿入します

    4. MariaDB SYSTEM_USER()の説明