2

今天找了一个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_ROWSCNMAX(ORA_ROWSCN)时, CHANGE_NUM 按预期增加。

那么我们在第一个 sql 中得到的 ORA_ROWSCN 是什么?组的第一个更改数量?这种用法的含义是什么?

PS:我使用的是 Oracle 数据库 11g

4

2 回答 2

2

“我惊讶地发现 ORA_ROWSCN 不是 GROUP BY 子句的一部分,是因为 ORA_ROWSCN 是伪列吗?”

是的。您可以将 ORA_ROWSCN 替换为另一个伪列,如 SYSDATE,并且您的查询仍然有效。

“当我向 DEVICE 表添加一条记录时,结果的 QUANTITY 增加了,但 CHANGE_NUM 没有改变”

根据文档,“Oracle 通过为该行所在的块提交的事务跟踪 SCN。” (强调我的)。因此,如果您没有使用 ROWDEPENDENCIES 跟踪 SCN(这是默认设置),那么您将看到 ORA_ROWSCN 的值是最后提交的事务的 SCN。在有人(不一定是您)发出 COMMIT 之前,CHANGE_NUM 不会改变。

请注意,如果您一直在使用带有 ROWDEPENDENCIES 的表,则 ORA_ROWSCN 函数将返回 null,直到您发出提交。

在任何一种情况下,当您执行聚合查询时,ORA_ROWSCN 的值是块(或表 - 我认为 - 当使用 ROWDEPENDENCIES 时)的最大值。

于 2012-08-14T12:50:54.143 回答
0

请参阅以下链接:

Oracle® 数据库 SQL 参考 -> ORA_ROWSCN 伪列

http://asktom.oracle.com -> ORA_ROWSCN 奇怪的行为

于 2012-08-14T09:45:41.943 回答