以下是有问题的SQL示例;该SQL应该在任何Oracle DBMS上运行(我正在运行11.2.0.2.0)。
请注意结果集中UUID值的不同(一个为898,另一个为899),尽管它们都是在内联视图/with子句中构建的。在下面更深入地了解一下,您可以看到DBMS_RANDOM.RANDOM()没有这种副作用。
SQL:
WITH data AS (SELECT SYS_GUID () uuid FROM DUAL)
SELECT uuid, uuid
FROM data
输出:
UUID UUID_1
F8FCA4B4D8982B55E0440000BEA88F11 F8FCA4B4D8992B55E0440000BEA88F11
与 DBMS_RANDOM 相比,结果是相同的
SQL:
WITH data AS (SELECT DBMS_RANDOM.RANDOM() rand FROM DUAL)
SELECT rand, rand
FROM data
输出:
RAND RAND_1
92518726 92518726
更有趣的是,我可以通过调用DBMS_RANDOM.RANDOM来改变行为/稳定sys_guid:
WITH data AS (
SELECT SYS_GUID () uuid,
DBMS_RANDOM.random () rand
FROM DUAL)
SELECT uuid a,
uuid b,
rand c,
rand d
FROM data
稳定 SYS_GUID 的 SQL Fiddle: http://sqlfiddle.com/#!4/d41d8/29409
展示奇怪的 SYS_GUID 行为的 SQL Fiddle: http://sqlfiddle.com/#!4/d41d8/29411
NEWID()
函数具有类似的、不可预测的行为,这取决于所选择的执行计划。 - ypercubeᵀᴹ