Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Kombinieren von 2 if-Blöcken und Erstellen einer einzelnen Abfrage

(HINWEIS:Dieser Code ist ungetestet und ich kann hier ein Komma oder eine Klammer dort weglassen...)

Diese beiden Blöcke scheinen sich nur in der Aktionsspalte und einem Join zu unterscheiden, sodass Sie die beiden IF-Zweige eliminieren und die Überprüfung von p_update_mode in eine CASE-Anweisung wie diese verschieben könnten:

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;

Die Abfrage in Ihrem FULL-Block besagt, dass wir in diesem Modus nicht mit B verbinden sollten. Die LEFT JOIN-Klausel bringt also nur Zeilen zurück, wenn sie sich im INCREMENTAL-Modus befindet, sollte aber keine Zeilen für den FULL-Modus erzeugen.

Dies muss ein LEFT-Join sein oder wir erhalten möglicherweise keine Zeilen aus Ihrer data_view, die nicht den Entitäten in B für den FULL-Modus entsprechen. Mit anderen Worten, wenn dies ein regulärer JOIN bleiben würde, würde Ihre Gesamtabfrage aufgrund der AND-Klausel im Join null Zeilen im FULL-Modus erhalten.

Schließlich wird der AND-Filter in der WHERE-Klausel unten notwendig, da es einen LEFT JOIN gibt. Ohne dies würden Sie beim Ausführen im INCREMENTAL-Modus JEDE Zeile in Ihrer data_view erhalten, UNGEACHTET davon, ob es eine entsprechende Entitätszeile in B gibt oder nicht. Auch wenn Sie bei der Entität_id beitreten, bringt der linke Join eine Zeile für jede Zeile in T zurück, auch ohne eine passende Zeile in B, denn dafür wurden LEFT JOINs entwickelt.

Alles in allem müssen Sie entscheiden, ob es sich lohnt, diese beiden Blöcke zu mischen. Nur weil Sie KÖNNEN, heißt das nicht, dass Sie SOLLTEN. Ihre Leistung ist möglicherweise besser, wenn Sie es so lassen, wie Sie es haben. Führen Sie einige Tests durch. Nur Sie kennen das Datenvolumen und die Häufigkeit der Verarbeitung. Sie müssen auch die Wartung Ihres Codes in Betracht ziehen, da der nächste Typ/die nächste Frau herausfinden muss, was hier vor sich geht.