Как я могу использовать «ДЛЯ ОБНОВЛЕНИЯ» с JOIN на Oracle? - PullRequest
1 голос
/ 06 апреля 2010

Ответ на другой вопрос SO заключался в использовании этого запроса SQL:

SELECT o.Id, o.attrib1, o.attrib2 
  FROM table1 o
  JOIN (SELECT DISTINCT Id 
          FROM table1, table2, table3 
         WHERE ...) T1 ON o.id = T1.Id

Теперь мне интересно, как я могу использовать это утверждение вместе с ключевым словом FOR UPDATE.Если я просто добавлю его в запрос, Oracle скажет мне:

ORA-02014: невозможно выбрать FOR UPDATE из представления

Нужно ли изменить запросЕсть ли хитрость, чтобы сделать это с Oracle?С MySql оператор работает нормально.

Ответы [ 2 ]

4 голосов
/ 06 апреля 2010

попробовать:

select ..... 
from <choose your table>
where id in (<your join query here>) for UPDATE;

РЕДАКТИРОВАТЬ : это может показаться немного нелогичным, если иметь в виду вопрос, на который вы ссылаетесь (который спрашивает, как отказаться от IN), но все же может принести пользу, если ваше объединение вернет ограниченный набор. Тем не менее, нет никакого обходного пути: исключение оракула довольно очевидно; оракул не знает, какие строки заблокировать из-за DISTINCT. Вы можете пропустить DISTINCT или определить все в представлении, а затем обновить его, если хотите, без явной блокировки: http://www.dba -oracle.com / t_ora_02014_cannot_select_for_update.htm

0 голосов
/ 06 апреля 2010

Это может зависеть от того, что вы хотите обновить.Вы можете сделать ... FOR UPDATE OF o.attrib1, чтобы сообщить, что вы заинтересованы только в обновлении данных из основной таблицы, что, вероятно, имеет место;это означает, что он будет только пытаться заблокировать эту таблицу и не беспокоиться о неявном представлении в соединении.(И вы все еще можете обновить несколько столбцов в этой таблице, если присвоить имя одному, все равно будет заблокирована вся строка - хотя это будет понятнее, если вы укажете все столбцы, которые хотите обновить в предложении FOR UPDATE OF).не знаю, будет ли это работать с MySQL, что возвращает нас к точке Марка Байерса.

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