Согласованность записи с вложенным подзапросом в Oracle - PullRequest
4 голосов
/ 28 сентября 2011

Я прочитал многие из gory подробностей о последовательности записи и понимаю, как это работает в простых случаях.Я не совсем понимаю, что это означает для вложенных подзапросов.

Вот конкретный пример:

Таблица с идентификатором PK и другими столбцами: состояние, температура и дата.

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
)

Реальная вещь была более запутанной (в самом внутреннем запросе), но это отражает суть.

Если мы предположим, что столбец состояния не имеет значения NULL, может ли это обновление произойти когда-либо из-заодновременное изменение (т. е. функция DECODE не находит совпадения, значение 'дождливое' или 'солнечное' и пытается вставить нулевое значение в столбец без значения NULL)?

Ответы [ 3 ]

2 голосов
/ 28 сентября 2011

Я не вижу причин для беспокойства. Подзапрос явно извлекает только идентификаторы строк с state 'дождливым' или 'солнечным', и это то, что собирается получить внешний DECODE. Единственная вещь - это одно утверждение, которое будет выполняться в рамках транзакции.

2 голосов
/ 28 сентября 2011

Oracle поддерживает «согласованность чтения и записи на уровне операторов» (как и во всех других серьезных СУБД)

Это означает, что оператор в целом не увидит никаких изменений в базе данных, которые произошли после запуска оператора.

Поскольку ваш UPDATE является одним единственным утверждением, не должно быть случая, когда декодирование возвращает ноль.

Кстати: оператор может быть упрощен, вам не нужен внешний 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 голос
/ 24 октября 2011

Отвечая на мой собственный вопрос: оказывается, в Oracle есть ошибка, которая может привести к сбою этого запроса.Подробности подтверждены Томом Кайтом, в обсуждении, начинающемся здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...