sql >> Database >  >> RDS >> Oracle

Combineren van 2 if block en het maken van een enkele query

(OPMERKING:deze code is niet getest en ik kan een komma hier of een haakje daar kwijt zijn...)

Die twee blokken lijken alleen te verschillen in de actiekolom en een join, dus je zou de 2 IF-benen kunnen elimineren en de controle van p_update_mode naar een CASE-instructie als deze kunnen verplaatsen:

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;

De query in je VOLLEDIGE blok zegt dat we in deze modus niet moeten deelnemen aan B. Dus de LEFT JOIN-clausule brengt alleen rijen terug in de INCREMENTAL-modus, maar zou geen rijen moeten produceren voor de FULL-modus.

Dit moet een LEFT-join zijn, anders krijgen we mogelijk geen rijen uit uw data_view die niet overeenkomen met entiteiten in B voor de FULL-modus. Met andere woorden, als dit een normale JOIN zou blijven, zou uw algemene zoekopdracht nul rijen krijgen in de FULL-modus vanwege de AND-component in de join.

Ten slotte wordt het AND-filter in de WHERE-component onderaan noodzakelijk nu er een LEFT JOIN is. Zonder dit zou u ELKE rij in uw data_view krijgen als u in de INCREMENTAL-modus werkt, ONGEACHT of er een overeenkomstige entiteitrij in B is of niet. Ook al doe je mee op entiteit_id, de linker join zal een rij terugbrengen voor elke rij in T, zelfs zonder een overeenkomende rij in B, want daarvoor zijn LEFT JOINs ontworpen.

Dat gezegd hebbende, je zult moeten beslissen of het de moeite waard is om deze twee blokken te mengen. Alleen omdat je KAN, wil niet zeggen dat je MOET. Je prestaties zijn misschien beter, laat het zoals je het hebt - voer een aantal tests uit. Alleen u kent de hoeveelheid gegevens en de frequentie van verwerking. Je moet ook rekening houden met het onderhoud van je code, want de volgende jongen/meisje zal moeten uitzoeken wat hier aan de hand is.




  1. Hoe voorkom ik reparatie met keycache in MySQL?

  2. Databaseontwerp / normalisatiestructuur moet EN's, OR's, optionele elementen en hun relaties bevatten

  3. Kopieer NULL-waarden aanwezig in csv-bestand naar postgres

  4. SQL-query vastgelopen in statistiekstatus