Oracle
 sql >> Base de données >  >> RDS >> Oracle

Combinaison de 2 if block et création d'une seule requête

(REMARQUE :ce code n'a pas été testé et il se peut qu'il y ait une virgule ici ou une parenthèse là...)

Ces deux blocs semblent ne différer que dans la colonne d'action et une jointure, vous pouvez donc éliminer les 2 jambes IF et déplacer la vérification de p_update_mode dans une instruction CASE comme celle-ci :

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 requête dans votre bloc FULL indique que nous ne devrions pas nous joindre à B dans ce mode. Ainsi, la clause LEFT JOIN ne ramène des lignes qu'en mode INCREMENTAL, mais ne devrait produire aucune ligne en mode FULL.

Cela doit être une jointure GAUCHE ou nous pourrions ne pas obtenir de lignes de votre data_view qui ne correspondent pas aux entités en mode B pour FULL. En d'autres termes, si cela restait une jointure normale, votre requête globale n'obtiendrait aucune ligne en mode FULL à cause de la clause AND dans la jointure.

Enfin, le filtre AND dans la clause WHERE en bas devient nécessaire maintenant qu'il y a un LEFT JOIN. Sans cela, lors de l'exécution en mode INCREMENTAL, vous obtiendriez CHAQUE ligne dans votre data_view INDÉPENDAMMENT de l'existence ou non d'une ligne d'entité correspondante dans B. Même si vous vous joignez à entity_id, la jointure gauche va ramener une ligne pour chaque ligne dans T même sans ligne correspondante dans B, car c'est ce que les LEFT JOIN ont été conçus pour faire.

Cela dit, vous devrez décider s'il vaut la peine de mélanger ces deux blocs. Ce n'est pas parce que vous POUVEZ que vous DEVEZ. Vos performances peuvent être meilleures en laissant les choses telles qu'elles sont :effectuez des tests. Vous seul connaissez le volume de données et la fréquence de traitement. Vous devez également tenir compte de la maintenance de votre code, car le prochain gars/fille devra comprendre ce qui se passe ici.