Đây là một ví dụ hoàn chỉnh, dựa trên câu trả lời của @Pablo Santa Cruz và mã bạn đã đăng.
Tôi không chắc tại sao bạn nhận được thông báo lỗi. Nó có thể là một vấn đề với Nhà phát triển SQL. Mọi thứ hoạt động tốt khi bạn chạy nó trong SQL * Plus và thêm một hàm:
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
Nhưng tôi sẽ gắn bó với SYS_GUID
nếu có thể. Xem ID 1371805.1 trên Hỗ trợ Oracle của tôi - lỗi này được cho là đã được sửa trong 11.2.0.3.
CHỈNH SỬA
Cái nào nhanh hơn tùy thuộc vào cách các chức năng được sử dụng.
Có vẻ như phiên bản Java nhanh hơn một chút khi được sử dụng trong SQL. Tuy nhiên, nếu bạn định sử dụng hàm này trong ngữ cảnh PL / SQL, thì hàm PL / SQL nhanh gấp hai lần. (Có lẽ vì nó tránh được chi phí chuyển đổi giữa các động cơ.)
Đây là một ví dụ nhanh:
--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;
/
HƯỚNG DẪN Phiên bản 4 không hoàn toàn ngẫu nhiên. Một số byte được cho là đã được sửa. Tôi không chắc tại sao điều này được thực hiện hoặc nó có quan trọng không, nhưng theo https://www.cryptosys.net/pki/uuid-rfc4122.html:
Quy trình tạo UUID phiên bản 4 như sau:
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"
Các giá trị từ phiên bản Java dường như tuân theo tiêu chuẩn.