为什么ORA_ROWSCN可以在SELECT子句中使用但不在GROUP BY子句中

时间:2012-08-14 05:31:09

标签: sql oracle

今天我找到了一个用于检查表的修改的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

2 个答案:

答案 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)