0

我有一个 Oracle 数据库,我正在尝试以编程方式确定视图是否具有与其从中提取的表相同数量的记录。这可能不是因为视图可能错误地查询了另一个模式中的表。起初我试着做

select count(*) from view  

然后做

select count(*) from 
(select * from table1
 union 
select * from table2)

并比较结果。

问题是我担心有人在我的第一个查询和第二个查询之间的时间内插入到 table2 中。在那种情况下,我可能从视图中获得了 5 条记录,但插入完成后,我可能从第二个查询中获得 6 条记录。

我不想虚报问题,所以我考虑做两个查询的联合:

select count(*) from view
union 
select count(*) from 
(select * from table1
union select * from table2)

但我不知道这是否真的会阻止在查询到视图和查询到表联合之间发生插入。

基本上我需要知道 Oracle 是在数据快照上进行这两个选择还是数据是动态的。

4

1 回答 1

2

Oracle 中的单个 SQL 语句始终可以查看存在于特定 SCN(系统更改号)的数据。假设默认事务隔离级别为已提交读,即查询开始时的 SCN。因此,假设纯 SQL,双方UNION将根据查询开始时 SCN 的数据确定。

这里需要注意的是视图是否包含对 PL/SQL 的调用(即,用于确定是否包含特定行的函数调用)。PL/SQL 块中的查询将查看数据的当前状态,而不一定是查询开始时的状态。

如果您真的只关心返回的行数,而不关心实际数据,那么执行类似的操作似乎更合乎逻辑

SELECT (SELECT COUNT(*) cnt FROM view) -
       (SELECT COUNT(*) cnt FROM table) num_diffs
  FROM dual

如果你真的想比较数据

SELECT <<columns>>
  FROM table
MINUS
SELECT <<columns>>
  FROM view

将向您显示表中不存在的数据

于 2013-11-06T19:13:06.573 回答