Oracle
 sql >> Database >  >> RDS >> Oracle

Combinando 2 se blocco e creando una singola query

(NOTA:questo codice non è stato testato e potrei essere fuori una virgola qui o una parentesi lì...)

Questi due blocchi sembrano differire solo nella colonna dell'azione e in un join, quindi potresti eliminare le 2 gambe IF e spostare il controllo di p_update_mode in un'istruzione CASE come questa:

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;

La query nel tuo blocco FULL dice che non dovremmo unirci a B in questa modalità. Quindi la clausola LEFT JOIN riporta le righe indietro solo in modalità INCREMENTALE, ma non dovrebbe produrre righe per la modalità COMPLETA.

Questo deve essere un join LEFT o potremmo non ottenere alcuna riga dalla tua data_view che non corrisponda alle entità in B per la modalità COMPLETA. In altre parole, se questo rimanesse un JOIN normale, la tua query complessiva otterrebbe zero righe in modalità FULL a causa della clausola AND nel join.

Infine, il filtro AND nella clausola WHERE in basso diventa necessario ora che c'è un LEFT JOIN. Senza questo, durante l'esecuzione in modalità INCREMENTALE, otterresti OGNI riga nella tua vista_dati INDIPENDENTE che ci sia una riga di entità corrispondente in B o meno. Anche se ti stai unendo su entity_id, il join sinistro riporterà indietro una riga per ogni riga in T anche senza una riga corrispondente in B, perché questo è ciò per cui i LEFT JOIN sono stati progettati.

Detto questo, dovrai decidere se vale la pena fondere questi due blocchi. Solo perché PUOI, non significa che DOVRAI. Le tue prestazioni potrebbero essere migliori lasciandole come le hai fatte:esegui alcuni test. Solo tu conosci il volume di dati e la frequenza di elaborazione. Devi anche considerare la manutenzione del tuo codice, poiché il prossimo ragazzo/ragazza dovrà capire cosa sta succedendo qui.