Oracle SYS_GUID не меняется - PullRequest
12 голосов
/ 13 марта 2009

У меня есть проект Oracle, который хорошо подходит для использования идентификаторов GUID в качестве ключа. Я нашел следующий фрагмент

SET SERVEROUTPUT ON
BEGIN
FOR indx IN 1 .. 5
LOOP
DBMS_OUTPUT.put_line ( SYS_GUID );
END LOOP;
END;
/

С http://feuerthoughts.blogspot.com/2006/02/watch-out-for-sequential-oracle-guids.html

Когда я запускаю его для своей базы данных (я пробовал это в версиях 10g и 11), я получаю вывод вроде

64FE4083D6BA7CB4E0400F0A0E0A18B0
64FE4083D6BB7CB4E0400F0A0E0A18B0
64FE4083D6BC7CB4E0400F0A0E0A18B0
64FE4083D6BD7CB4E0400F0A0E0A18B0
64FE4083D6BE7CB4E0400F0A0E0A18B0

т.е. значение никогда не меняется! Есть ли что-то, что я должен сделать, чтобы настроить его на работу, как ожидалось?

Редактировать: Я не очень наблюдателен - GUID меняются, но похоже, что я страдаю от последовательной проблемы GUID, о которой говорит ссылка выше.

Ответы [ 2 ]

17 голосов
/ 13 марта 2009

Кажется, хорошо. Из описания:

SYS_GUID генерирует и возвращает глобальный уникальный идентификатор (значение RAW) состоит из 16 байтов. На большинстве платформы, сгенерированный идентификатор состоит из идентификатора хоста, идентификатор процесса или потока процесс или поток, вызывающий функция и значение неповторяющееся (последовательность байтов) для этого процесса или нить.

Из вашего примера:

64FE4083D6B<b>A</b>7CB4E0400F0A0E0A18B0
64FE4083D6B<b>B</b>7CB4E0400F0A0E0A18B0
64FE4083D6B<b>C</b>7CB4E0400F0A0E0A18B0
64FE4083D6B<b>D</b>7CB4E0400F0A0E0A18B0
64FE4083D6B<b>E</b>7CB4E0400F0A0E0A18B0

Никто не упоминал о распределении этих значений GUID. Они должны быть неповторяющимися, и они есть. Если вы не получаете точно один и тот же вывод каждый раз.

16 голосов
/ 13 марта 2009

Значение меняется ....

           *
64FE4083D6BA7CB4E0400F0A0E0A18B0
64FE4083D6BB7CB4E0400F0A0E0A18B0
64FE4083D6BC7CB4E0400F0A0E0A18B0
64FE4083D6BD7CB4E0400F0A0E0A18B0
64FE4083D6BE7CB4E0400F0A0E0A18B0
           *
...