2016-06-24 2 views
0

У меня есть инструкция delete в последнем. По сути, я хочу удалить, только если merge возвратил строки или соответствовал. Можно ли сделать в одном заявлении merge into?Oracle сливается с удалением из другой таблицы

MERGE INTO ${TABLE_NAME} T 
USING (
    SELECT 
    ERRORCODE, PROCESSINGFILENAME, 
    RECORDNUMBER from ERROR_UPLOAD_T 
) TMP 
ON (T.RECORDNUMBER = TMP.RECORDNUMBER and 
T.PROCESSINGFILENAME= TMP.PROCESSINGFILENAME and 
T.PROCESSINGFILENAME='${new_err_xml}') 
WHEN MATCHED THEN 
UPDATE SET 
    T.STATUS = 'ERROR', 
    T.ERRORSOURCE = 'BRM', 
    T.ERRORCODE = TMP.ERRORCODE 

DELETE from ERROR_UPLOAD_T WHERE 
PROCESSINGFILENAME like '${new_err_xml}'; 

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

EDIT: Я пробовал этот способ, и он выглядит как работающий.

НАЧАТЬ

MERGE INTO ${TABLE_NAME} T 
USING (
    SELECT 
    ERRORCODE, PROCESSINGFILENAME, 
    RECORDNUMBER from ERROR_UPLOAD_T 
) TMP 
ON (T.RECORDNUMBER = TMP.RECORDNUMBER and 
T.PROCESSINGFILENAME= TMP.PROCESSINGFILENAME and 
T.PROCESSINGFILENAME='${new_err_xml}') 
WHEN MATCHED THEN 
UPDATE SET 
    T.STATUS = 'ERROR', 
    T.ERRORSOURCE = 'BRM', 
    T.ERRORCODE = TMP.ERRORCODE; 

if (sql%rowcount > 0) then 
    DELETE from ERROR_UPLOAD_T WHERE 
    PROCESSINGFILENAME like '${new_err_xml}'; 
end if; 

COMMIT; 
END; 
/
+1

Если вам удастся ответить на ваш собственный вопрос, вам рекомендуется опубликовать его как ответ, а не редактировать. –

+1

И нет, вы не можете удалить из исходной таблицы (из предложения 'use') как часть оператора слияния. –

+0

@ Mr.Llama Я не знал, что могу ответить на свой пост. Но мой вопрос по-прежнему остается таким же: «Мы можем достичь единственного слияния в условие». Я отправил свой ответ ниже. – user2570205

ответ

1

мне удалось добиться результата, изменив запрос в следующим образом.

BEGIN 
MERGE INTO ${TABLE_NAME} T 
USING (
    SELECT 
    ERRORCODE, PROCESSINGFILENAME, 
    RECORDNUMBER from ERROR_UPLOAD_T 
) TMP 
ON (T.RECORDNUMBER = TMP.RECORDNUMBER and 
T.PROCESSINGFILENAME= TMP.PROCESSINGFILENAME and 
T.PROCESSINGFILENAME='${new_err_xml}') 
WHEN MATCHED THEN 
UPDATE SET 
    T.STATUS = 'ERROR', 
    T.ERRORSOURCE = 'BRM', 
    T.ERRORCODE = TMP.ERRORCODE; 

if (sql%rowcount > 0) then 
    DELETE from ERROR_UPLOAD_T WHERE 
    PROCESSINGFILENAME like '${new_err_xml}'; 
end if; 

COMMIT; 
END; 
/
+0

Это кажется немного странным. Если * любые * строки в источнике совпадают с любым в целевом объекте - поэтому вы выполняете хотя бы одно обновление - тогда вы удаляете все строки в источнике; а не только те, которые соответствуют действительности. И если никакие строки не совпадают, тогда вы держите все. Я не сразу вижу, как это полезно, если только вы не ожидаете добавить соответствующие строки в таблицу назначения и запустить их позже. Но это потом возвращается к «любой» части. Это просто кажется странным - если это то, что вы действительно хотите, то это как проверить. –

+0

@AlexPoole, вы правы, там работает параллельная обработка, которая может создавать строки ошибок с деталями. Поэтому я буду держать их, пока они не будут загружены. Но да, если они не могут загрузиться, то вручную их перерабатывать и загружать. Наконец, источник и пункт назначения должны совпадать в одной точке, поэтому я считаю, что он будет удален при согласовании. – user2570205

+0

@AlexPoole Проблема с моим предыдущим утверждением заключается в том, что он удаляется, даже когда ничего не сопоставляется с целью. Это означает, что данные еще не загружены в цель. Проблема с многопоточными программами может задержать загрузку данных, но они должны существовать один - один. – user2570205

1

Нет, вы не можете удалить из исходной таблицы (из пункта using) или в другом месте, как часть самого слияния. From the documentation:

Укажите УДАЛИТЬ where_clause, чтобы очистить данные в таблице при заполнении или обновлении его. Единственными строками, затронутыми этим предложением, являются те строки в таблице назначения, которые обновляются с помощью операции слияния.

Таким образом, вы можете удалить только из таблицы назначения, которая не является тем, что вы хотите.

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