sql >> Databasteknik >  >> RDS >> Oracle

Kombinera 2 if block och skapa en enda fråga

(OBS:den här koden är opestad och jag kan vara utanför ett kommatecken här eller en parentes där...)

Dessa två block verkar bara skilja sig åt i åtgärdskolumnen och en join, så du kan eliminera de två IF-benen och flytta kontrollen av p_update_mode till en CASE-sats så här:

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;

Frågan i ditt FULL-block säger att vi inte ska gå med i B i det här läget. Så LEFT JOIN-satsen tar bara tillbaka rader i INCREMENTAL-läge, men bör inte producera några rader för FULL-läget.

Detta måste vara en LEFT-anslutning, annars kanske vi inte får några rader från din data_view som inte motsvarar entiteter i B för FULL-läge. Med andra ord, om detta förblev en vanlig JOIN, skulle din övergripande fråga få noll rader i FULL-läge på grund av AND-satsen i join.

Slutligen blir AND-filtret i WHERE-satsen längst ner nödvändigt nu när det finns en LEFT JOIN. Utan detta, när du kör i INCREMENTAL-läge, skulle du få VARJE rad i din data_view OAVSETT om det finns en motsvarande enhetsrad i B eller inte. Även om du går med på entity_id, kommer den vänstra kopplingen att föra tillbaka en rad för varje rad i T även utan en matchande rad i B, eftersom det är vad LEFT JOINs utformades för att göra.

Allt som sagt, du måste bestämma om det är värt att blanda dessa två block. Bara för att du KAN, betyder det inte att du BÖR. Din prestation kan bli bättre om du lämnar den som du har den - kör några tester. Det är bara du som vet mängden data och frekvensen av bearbetningen. Du måste också överväga underhållet av din kod, eftersom nästa kille/gal måste ta reda på vad som händer här.




  1. Pandas Skrivtabell till MySQL:kan inte återställas

  2. #1062 - Dubblett inmatning för nyckel 'PRIMÄR'

  3. Skickar tabellnamnet som parameter för förberedd sats

  4. Hur man gör null lika med null i oracle