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

Yer*_*yan 2 sql oracle caching

当插入批量行并使用函数调用作为列值之一时,我从函数中获得每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;
Run Code Online (Sandbox Code Playgroud)

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

INSERT INTO My_TABLE(ID, NAME,)
SELECT NEW_UUID(), NAME
FROM MY_TABLE2;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

此语句中的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
Run Code Online (Sandbox Code Playgroud)

Ben*_*oit 6

APC的诊断是正确的.您需要在随机生成器种子中使用熵.

虽然,Oracle已经拥有一个独特的id生成器SYS_GUID().

SELECT sys_guid(), name FROM my_table2;
Run Code Online (Sandbox Code Playgroud)

你可以试试这个产生9个GUID:

SELECT sys_guid() from dual connect by level < 10;
Run Code Online (Sandbox Code Playgroud)

Tora截图

当它已经存在时,不要试图重新发明轮子.