gpt4 book ai didi

sql - 在批量插入期间正在缓存 oracle 函数调用

转载 作者:行者123 更新时间:2023-12-04 20:34:36 24 4
gpt4 key购买 nike

当插入批量行并使用函数调用作为列值之一时,我从函数中每 10-11 行得到完全相同的值。该函数实际上生成 UUID 值并返回唯一结果。如果我用函数的实际代码替换插入语句中的函数调用,它永远不会重复。

所以我由此得出的结论是,oracle 实际上缓存了函数的结果,并且每插入 10-11 行仅调用一次。我怎样才能改变这种行为?

我正在调用的函数是从 http://www.oracle-base.com/articles/9i/UUID9i.php 中获取的:

create or replace
FUNCTION new_uuid RETURN VARCHAR2 AS
l_seed BINARY_INTEGER;
l_random_num NUMBER(5);
l_date VARCHAR2(25);
l_random VARCHAR2(4);
l_ip_address VARCHAR2(12);
BEGIN
l_seed := TO_NUMBER(TO_CHAR(SYSDATE,'YYYYDDMMSS'));
DBMS_RANDOM.initialize (val => l_seed);
l_random_num := TRUNC(DBMS_RANDOM.value(low => 1, high => 65535));
DBMS_RANDOM.terminate;

l_date := conversion_api.to_hex(TO_NUMBER(TO_CHAR(SYSTIMESTAMP,'FFSSMIHH24DDMMYYYY')));
l_random := RPAD(conversion_api.to_hex(l_random_num), 4, '0');
l_ip_address := conversion_api.to_hex(TO_NUMBER(REPLACE(NVL(SYS_CONTEXT('USERENV','IP_ADDRESS'), '123.123.123.123'), '.', '')));

RETURN SUBSTR(l_date, 1, 8) || '-' ||
SUBSTR(l_date, 9, 4) || '-' ||
SUBSTR(l_date, 13, 4) || '-' ||
RPAD(SUBSTR(l_date, 17), 4, '0') || '-' ||
RPAD(L_RANDOM || L_IP_ADDRESS, 12, '0');
END;

这是我正在使用的插入语句:

INSERT INTO My_TABLE(ID, NAME,)
SELECT NEW_UUID(), NAME
FROM MY_TABLE2;
COMMIT;

此语句中的 select 会产生大量重复的 UUID。而这条语句产生独特的:

SELECT RPAD(RPAD(my_schema.conversion_api.to_hex(TRUNC(DBMS_RANDOM.VALUE( 1, 65535))), 4, '0') || my_schema.conversion_api.to_hex(TO_NUMBER(REPLACE(NVL(SYS_CONTEXT('USERENV','IP_ADDRESS'), '123.123.123.123'), '.', ''))), 12, '0') sss
FROM my_schema.MY_TABLE

最佳答案

APC 的诊断是正确的。您的随机生成器种子中需要有熵。

不过,Oracle 已经有一个唯一的 ID 生成器,它是 SYS_GUID()

SELECT sys_guid(), name FROM my_table2;

您可以尝试生成 9 个 GUID:

SELECT sys_guid() from dual connect by level < 10;

Tora screenshot

不要试图重新发明已经存在的轮子。

关于sql - 在批量插入期间正在缓存 oracle 函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7977934/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com