与Oracle中的嵌套子查询写入一致性

时间:2011-09-28 02:56:56

标签: sql oracle oracle10g

我已经阅读了很多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插入非可空列中?)

3 个答案:

答案 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的讨论中确认了详细信息。