(NOTA:este código não foi testado e posso estar sem uma vírgula aqui ou um parêntese ali...)
Esses dois blocos parecem diferir apenas na coluna de ação e em uma junção, então você pode eliminar as 2 pernas IF e mover a verificação de p_update_mode para uma instrução CASE como esta:
CREATE OR REPLACE PROCEDURE update_dynamic_entity(p_entity_type VARCHAR2 DEFAULT NULL,
p_update_mode VARCHAR2) IS
BEGIN
INSERT INTO dynamicentitygtt
(entity_type, entity_id, entity_code, synonyms, action)
WITH data_view AS
( -- ITEM table
SELECT 'ITEM' entity_type, -- This separates inserted values
item_id data_id,
item_name data_name,
item_desc data_desc,
creation_date
FROM itemde
UNION ALL
-- ORG table
SELECT 'ORG' entity_type, -- This separates inserted values
org_id,
org_name,
org_desc,
creation_date
FROM orgde
-- NEXT entity table
)
SELECT upper(t.entity_type),
t.data_id,
t.data_name,
t.data_desc,
CASE lower(p_update_mode)
WHEN 'incremental' THEN
CASE
WHEN t.creation_date > b.max_last_update_date THEN
'update'
WHEN t.creation_date < b.max_last_update_date THEN
'add'
END
WHEN 'full' THEN
'add'
END action
FROM data_view t
LEFT JOIN batch_run_details b
ON b.entity_type = t.entity_type
AND lower(p_update_mode )='incremental'
WHERE (upper(p_entity_type) = t.entity_type OR p_entity_type IS NULL)
AND (lower(p_update_mode) = 'full'
OR (lower(p_update_mode) = 'incremental' AND b.entity_type IS NOT NULL)
);
END update_dynamic_entity;
A consulta em seu bloco FULL diz que não devemos nos unir a B neste modo. Portanto, a cláusula LEFT JOIN só traz linhas de volta no modo INCREMENTAL, mas não deve produzir linhas no modo FULL.
Isso precisa ser uma junção LEFT ou podemos não obter nenhuma linha do seu data_view que não corresponda às entidades em B para o modo FULL. Em outras palavras, se isso permanecesse um JOIN regular, sua consulta geral obteria zero linhas no modo FULL devido à cláusula AND na junção.
Por fim, o filtro AND na cláusula WHERE na parte inferior torna-se necessário agora que existe um LEFT JOIN. Sem isso, ao executar no modo INCREMENTAL, você obteria TODAS as linhas em seu data_view INDEPENDENTEMENTE de haver uma linha de entidade correspondente em B ou não. Mesmo que você esteja entrando em entity_id, a junção esquerda trará uma linha de volta para cada linha em T, mesmo sem uma linha correspondente em B, porque é para isso que os LEFT JOINs foram projetados.
Dito isso, você terá que decidir se vale a pena misturar esses dois blocos. Só porque você PODE, não significa que você DEVE. Seu desempenho pode ser melhor deixando-o do jeito que você tem - execute alguns testes. Só você sabe o volume de dados e a frequência de processamento. Você também precisa considerar a manutenção do seu código, pois o próximo cara terá que descobrir o que está acontecendo aqui.