2013-05-07 4 views
0

Я нашел очень похожую тему на Oracle Equivalent to MySQL INSERT IGNORE? Однако я не мог сделать работу ни одним из предлагаемых решений. Мой случай немного особенный, так как моя таблица содержит только 1 поле, которое является первичным ключом. Давайте назовем поле «id» и таблицу «myTable» в следующем.Оракул эквивалент INSERT IGNORE

Использование MERGE

merge into myTable t1 from (
    select 42 as the_pk_value, 'TEST' as some_column from dual 
) t2 on (t1.id = t2.the_pk_value) 
when not matched then 
    insert (id) values (t2.the_pk_value); 

Эта первая попытка выдает сообщение об ошибке в SQL Error: ORA-02012: missing USING keyword. Я должен признать, что я НЕ понял предложенный синтаксис, поэтому, возможно, я что-то испортил, адаптировавшись к моей таблице pk-only-table. Но поскольку показанный пример не использовал ключевое слово USING, я не понимаю, где моя ошибка.

Используя подсказку

insert /*+ ignore_row_on_dupkey_index(SPSECU, PK_SPSECU) */ into myTable (id) values ('TEST'); 

Это работает через SQL Developer, однако он не работает с Java (я подозреваю, OJDBC драйвер, чтобы удалить комментарии, чтобы уменьшить размер передачи. Кстати, я не мог понять, какие драйвер JDBC Я использую ... расслоение Spring Tool Source кажется для подключения без дополнительной конфигурации к базе данных Oracle. Я вижу, установлен только драйвер DERBY по умолчанию.

Использование NOT EXISTS

Я не мог заставить этот синтаксис работать. Вот что я писал:

insert into myTable (id) values ('TEST') where not exists (select id from myTable where id='TEST'); 

Я получаю ошибку SQL Error: ORA-00933: SQL command not properly ended с этой версией.

Использование вставки выберите

Я ничего предлагаемого решения по knagaev не понимают ... пытаясь приспособить его к моему столу дал мне это:

insert into myTable t1 select id from myTable t2 where not exists (select 1 from t1 where t1.id = 'TEST'); 

Может кто-нибудь мне помочь? Я привык к простому синтаксису MySQL INSERT IGNORE и совершенно новый для Oracle (с использованием версии 11g).

ответ

1

Merge использует using вместо from:

merge into myTable t1 USING (
    select 42 as the_pk_value, 'TEST' as some_column from dual 
) t2 on (t1.id = t2.the_pk_value) 
+0

Ваш синтаксис действительно работать, используя SQL Developer. Но ... по какой-то причине при вызове с Java появляется сообщение об ошибке «ORA-00001: уникальное ограничение (PK_MYTABLE)». Сообщение об ошибке печатает точный SQL-запрос, и он отлично работает, когда я копирую его в SQL Developer (первое сообщение: '1 rows merged.') следующие сообщения:' 0 rows merged.'). Есть идеи ? – Wis

+0

Не уверен, я не эксперт по Java. Возможно, опубликовать новый вопрос Java с помощью фрагмента кода? – Andomar

+0

Я подозреваю что-то с драйвером Oracle ... На данный момент я приму ваше решение, вы дали мне верный ответ Oracle (даже если он не прошел через Java-вызов). – Wis

Смежные вопросы