Оператор слияния Oracle не достигает части NOT MATCHED

Следующий оператор слияния не вставляет (не соответствует) запись.

Запрос, используемый в части Condition предложения Merge, иногда не возвращает ни одной строки.

Это приводит к тому, что вставка не происходит?

MERGE INTO apps.test_table ab USING
(SELECT batch_id
FROM apps.test_table
WHERE session_name='session_name'
AND status        ='NOT STARTED'
)b ON (ab.batch_id=b.batch_id)
WHEN MATCHED THEN
  UPDATE
  SET STATUS         ='RUNNING',
    tag_receive_time = sysdate,
    sess_start_time  = SYSDATE,
    wflw_start_time  = sysdate
  WHERE batch_id     = b.batch_id 
WHEN NOT MATCHED THEN
  INSERT
    (
      ab.batch_id,
      ab.status,
      ab.workflow_name,
      ab.session_name,
      ab.source_name,
      ab.target_table,
      ab.created_by,
      ab.creation_date,
      ab.snapshot_date,
      ab.tag_receive_time,
      ab.sess_start_time,
      ab.wflw_start_time
    )
    VALUES
    (
      apps.batch_id_seq.nextval,
      'RUNNING',
      '$PMWorkflowName',
      '$PMSessionName',
      'AMPS',
      'SPARES_F_ORDER_SHIPMENT_DTL',
      'Informatica',
      SYSDATE,
      SYSDATE,
      SYSDATE,
      SYSDATE,
      SYSDATE
    )
    ; 

person Gautam Hans    schedule 04.11.2019    source источник
comment
пожалуйста, предоставьте образцы данных для таблицы apps.test_table   -  person Andrew    schedule 04.11.2019
comment
что вы видите, когда выдается show errors? Кстати, удалите часть WHERE batch_id = b.batch_id из инструкции Update.   -  person Barbaros Özhan    schedule 04.11.2019
comment
Ваше заявление о слиянии говорит: найдите мне эти конкретные строки в apps.test_table, а затем, если они соответствуют строке в apps.test_table, обновите их, иначе вставьте их. Вы видите в этом проблему? Вы ищете подмножество строк, существующих в таблице... конечно, ваш исходный подзапрос не найдет дополнительных строк, которых еще нет в apps.test_table! Ваша when not matched часть этого оператора слияния не имеет значения, и вы должны удалить ее.   -  person Boneist    schedule 04.11.2019


Ответы (2)


Вы уже проверили соответствие для оператора Update в ON (ab.batch_id=b.batch_id), затем вам нужно удалить WHERE batch_id = b.batch_id после оператора Update.

Вы можете проверить это в качестве примеров синтаксиса, где ни один из операторов обновления содержать предложение where

person Barbaros Özhan    schedule 04.11.2019
comment
Я удалил это условие, но проблема не устранена - person Gautam Hans; 04.11.2019
comment
Привет! Я удалил условие. Спасибо за совет. Но оператор Merge все еще не достигает части NOT MATCHED. Имейте в виду, что запрос, используемый в условии, не возвращает ни одной строки. - person Gautam Hans; 04.11.2019
comment
пожалуйста @GautamHans, что вы видите, когда show errors выдается в командной строке? - person Barbaros Özhan; 04.11.2019

Разбейте запрос, чтобы увидеть, какие результаты приходят. Запустите и проверьте результат запроса снизу. Выберите запрос:

SELECT batch_id FROM apps.test_table WHERE session_name='session_name' AND 
status ='NOT STARTED'

И результат столбца batch_id приведенного выше запроса содержится в таблице apps.test_table или нет, если нет, то его следует вставить в таблицу apps.test_table, иначе ваш оператор Update будет работать

Удалите WHERE batch_id = b.batch_id из Update, так как он не нужен.

person Andrew    schedule 04.11.2019