我已经阅读了很多gory写一致性的细节,我理解它在简单的情况下是如何工作的。我不清楚的是这对于嵌套子查询意味着什么。
这是一个具体的例子:
具有PK id的表,以及其他列state,temp和date。
UPDATE table SET state = DECODE(state, 'rainy', 'snowy', 'sunny', 'frosty') WHERE id IN (
SELECT id FROM (
SELECT id,state,temp from table WHERE date > 50
) WHERE (state='rainy' OR state='sunny') AND temp < 0
)
真实的东西更复杂(在最里面的查询中),但这抓住了本质。
如果我们假设状态列不可为空,则此更新可能由于并发修改而失败(即,DECODE函数找不到匹配,值为'rainy'或'sunny',因此尝试将null插入非可空列中?)
答案 0 :(得分:2)
Oracle支持“语句级读写一致性”(与所有其他严重的DBMS一样)
这意味着整个语句在语句启动后不会看到对数据库的任何更改。
由于您的UPDATE是一个单一语句,因此不应该出现解码返回null的情况。
顺便说一句:语句可以简化,你不需要子查询中的外部SELECT:
UPDATE table SET state = DECODE(state, 'rainy', 'snowy', 'sunny', 'frosty')
WHERE id IN (
SELECT id
FROM table
WHERE date > 50
AND (state='rainy' OR state='sunny')
AND temp < 0
)
答案 1 :(得分:2)
我认为没有理由担心。子查询仅显式检索具有state
'rainy'或'sunny'的行的ID,这就是外部DECODE
将获得的内容。 Thole是一个声明,将在事务边界内执行。
答案 2 :(得分:1)
回答我自己的问题:事实证明Oracle中存在一个错误,可能导致此查询失败。 Tom Kyte在开始here的讨论中确认了详细信息。