今天我找到了一个用于检查表的修改的SQL,如下所示:
SELECT MODEL_ID, STATUS_ID, COUNT(*) as QUANTITY, ORA_ROWSCN as CHANGE_NUM
FROM DEVICE
GROUP BY MODEL_ID, STATUS_ID
当我向DEVICE表添加一条记录时,结果的QUANTITY增加但CHANGE_NUM没有改变。
然后我惊讶地发现ORA_ROWSCN不是GROUP BY子句的一部分,是因为ORA_ROWSCN是伪列?
当我将ORA_ROWSCN
更改为MAX(ORA_ROWSCN)
时,CHANGE_NUM按预期增加。
那么我们在第一个sql中得到的ORA_ROWSCN是什么?一组的第一个更改数量?这种用法的含义是什么?
PS:我正在使用Oracle Database 11g
答案 0 :(得分:2)
“我很惊讶地发现ORA_ROWSCN不属于GROUP BY 是的,因为ORA_ROWSCN是一个伪列?“
是。您可以将ORA_ROWSCN替换为另一个类似SYSDATE的伪列,您的查询仍然有效。
“当我向DEVICE表添加一条记录时,结果的QUANTITY 增加但是CHANGE_NUM没有改变“
根据the documentation,“Oracle通过事务已提交跟踪行所在的块的SCN。” (强调我的)。因此,如果您没有使用ROWDEPENDENCIES跟踪SCN(这是默认值),那么您将看到ORA_ROWSCN的值是上次提交的事务的SCN。在某人(不一定是你)发出COMMIT之前,CHANGE_NUM不会改变。
请注意,如果您一直在使用带有ROWDEPENDENCIES的表,则ORA_ROWSCN函数将返回null,直到您发出提交。
在任何一种情况下,当您执行聚合查询时,ORA_ROWSCN的值是块(或表 - 我认为 - 使用ROWDEPENDENCIES时)的最大值。
答案 1 :(得分:0)