在oracle合并查询中求值的顺序是什么?
例如:
MERGE INTO SCEHMA.TABLE updtab
USING (SELECT * FROM SOURCE_VIEW) fromtab
ON (updtab.key = fromtab.key)
WHEN MATCHED THEN UPDATE SET
updtab.field_1 = case when (updtab.field_1 is null) then fromtab.val_1 end,
updtab.field_2 = case when (updtab.field_1 is null) then fromtab.val_2 end;
field_1为null的两种情况会立即评估吗?还是每个集合都会按顺序执行,而field_2的第二个总是失败,因为field_1在第一个集合行之后将不再为null?
SQL的标准是,我相信选择总是先发生,但这是在更新步骤中吗?Oracle文档不清楚,这让我感到疑惑。
所有事情都发生在单个语句MERGE
中。Oracle"始终强制执行语句级读取一致性,从而确保单个查询返回的数据在单个时间点上是提交的和一致的">。在这种情况下,时间点是语句"是"的时间;打开"-它开始执行的时间。
这意味着field_1
被MERGE
语句的所有部分视为相同的数据,直到该语句终止。CCD_ 4被评估一次并且每次更新被执行,就好像数据没有改变一样。
在一个事务中,您是正确的。在默认的读取提交隔离级别中,不可重复的读取是可能的。如果重新运行SELECT
语句,并且另一个事务已提交数据,则第一个事务读取的数据可能不同。MERGE
是一个语句,而不是一个事务。