Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Combinando 2 if block e criando uma consulta única


(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.