Oracle эквивалент обновления MySQL игнорировать - PullRequest
7 голосов
/ 16 сентября 2011

Мне нужно выполнить запрос Oracle, который будет нарушать уникальные ограничения, только для записей, которые не будут нарушать ограничения. Я считаю, что в MySQL это можно сделать с помощью команды ignore . Есть ли эквивалент в Oracle?

Ответы [ 2 ]

8 голосов
/ 16 сентября 2011

Для этого вы можете использовать функцию регистрации ошибок Oracle:

Сначала вам нужно создать таблицу, которая позже будет содержать пропущенные строки:

EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('YOUR_TABLE', 'YOUR_TABLE_ERROR_LOG');

Это создаст таблицу с именем YOUR_TABLE_ERROR_LOG для таблицы с именем YOUR_TABLE (очевидно, вам нужно сделать это только один раз).

Когда вы запускаете ОБНОВЛЕНИЕ, вам нужно добавить предложение LOG ERRORS:

UPDATE your_table
   SET ...
WHERE ...
LOG ERRORS INTO YOUR_TABLE_ERROR_LOG ('UPDATE running at '||to_char(sysdate, 'yyyy-MM-dd HH24:MI:SS')) 
REJECT LIMIT UNLIMITED;

Указанная строка является произвольным значением, которое помогает вам определить действие, которое вызвало ошибки.

После обновления вы можете запросить таблицу YOUR_TABLE_ERROR_LOG, чтобы узнать, какие ошибки произошли и почему.Если вас не интересуют ошибки, просто обрежьте таблицу ошибок в дальнейшем.

Подробнее см. В руководстве:http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_10008.htm#BCEFBFCD

Редактировать 2014-10-27

Начиная с Oracle 11.2, существует новая подсказка с именем CHANGE_DUPKEY_ERROR_INDEX, которую можно использовать для этой цели.Хотя я никогда не пробовал этого.

Подробности в руководстве: http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements006.htm#CHDIFFJE

Для операций INSERT есть похожая подсказка с именем IGNORE_ROW_ON_DUPKEY_INDEX:
http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements006.htm#CHDEGDDG

Некоторые примеры:

0 голосов
/ 16 сентября 2011

Трудно однозначно сказать «нет» (Oracle большой), но за 15 лет программирования баз данных я никогда не видел подобной функции в Oracle. Вы можете отключить ограничения, но это не то же самое, что вы пытаетесь выполнить здесь.

Один из обходных путей - написать PL / SQL, который построчно обрабатывает таблицу, которую вы обновляете, пытается выполнить обновление и проглатывает любые ошибки. Это не будет эффективным, но это будет работать. Но в каждом сценарии, который я могу себе представить (если у вас нет очень и очень сложной таблицы), вы сможете написать свой запрос на обновление, включив в него соответствующие подзапросы, которые обходят ограничения. Точная стратегия будет зависеть от таблиц и запроса.

...