2011-01-21 3 views
1

Есть ли какая-либо функция Oracle, указывающая на существование записи или любой другой полезной техники для достижения этой цели?UPDATE запись, если присутствует; else INSERT в Oracle

EDIT: с помощью оператора MERGE я сделал:

MERGE 
INTO lims_min.mytab src 
USING lims_min.mytab tgt 
    ON ( src.col1 = tgt.col1 
     AND tgt.col1 = p_val1 
     AND src.col2 = tgt.col2 
     AND tgt.col2 = p_val2 
     ) 

WHEN MATCHED 
THEN 
UPDATE 
    SET tgt.col3=p_val3, 
     tgt.col4=p_val4 

WHEN NOT MATCHED 
THEN 
INSERT (col1, col2, col3, col4) 
VALUES (val1, val2, val2, val4); 

Я получаю ошибку о том, что col3 недействителен идентификатор. Нет опечаток, и в нем есть column.p_val1, p_val2, p_val3 и p_val4 - это строковые параметры, которые передаются в хранимую процедуру. Я думаю, что проблема может заключаться в этих параметрах, возможно, они должны быть помещены в инструкцию WHERE? Любые идеи?

+0

Oracle 10, я получил "PL/SQL: ORA-00904: "P COL3"." ": Недопустимый идентификатор" – sarsnake

+1

я думаю, что вам нужно to: «MERGE INTO tgt» (не src) - переключите их; и я не думаю, что вам нужно присоединиться к вашим таблицам src & tgt - просто укажите: ON (src.col1 = p_val1 и src.col2 = p_val2) – Gerrat

+0

ничего себе, хороший Gerrat! Спасибо. Pretty sneaky – sarsnake

ответ

4

Вы ищете merge в Oracle.

MERGE 
     INTO target_table tgt 
     USING source_table src 
     ON (src.object_id = tgt.object_id) //The key to check if the record exists 
     WHEN MATCHED // if exists 
     THEN 
    UPDATE 
     SET tgt.object_name = src.object_name //update it 
     ,  tgt.object_type = src.object_type 
     WHEN NOT MATCHED       // if not exists 
     THEN 
    INSERT (tgt.object_id     //then insert 
      , tgt.object_name 
      , tgt.object_type) 
    VALUES (src.object_id 
      , src.object_name 
      , src.object_type); 
+0

Может ли источник и цель быть одной и той же таблицей? Я пытаюсь сделать именно это, и я получаю ошибку Oracle, что один из столбцов (существующих) является недопустимым идентификатором .... – sarsnake

+0

и нет. Я не обновляю столбцы, на которые я согласен :) Я пытаюсь обновить другие столбцы, что является всей точкой этого ... – sarsnake

+0

Если вы правильно наложили псевдоним, вы должны иметь возможность использовать тот же источник и цель. – DCookie

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