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

Kombination af 2 if-blok og oprettelse af en enkelt forespørgsel

(BEMÆRK:denne kode er ikke testet, og jeg kan være ude af et komma her eller en parentes der...)

Disse to blokke ser ud til kun at adskille sig i handlingskolonnen og en join, så du kan eliminere de 2 IF-ben og flytte kontrollen af ​​p_update_mode til en CASE-sætning som denne:

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;

Forespørgslen i din FULL blok siger, at vi ikke skal slutte os til B i denne tilstand. Så LEFT JOIN-sætningen bringer kun rækker tilbage i INCREMENTAL-tilstand, men bør ikke producere rækker for FULL-tilstand.

Dette skal være en LEFT join, ellers får vi muligvis ikke nogen rækker fra din data_view, der ikke svarer til enheder i B for FULL-tilstand. Med andre ord, hvis dette forblev en almindelig JOIN, ville din overordnede forespørgsel få nul rækker i FULL-tilstand på grund af AND-sætningen i joinforbindelsen.

Til sidst bliver AND-filteret i WHERE-sætningen nederst nødvendigt nu, hvor der er en LEFT JOIN. Uden dette, når du kører i INCREMENTAL-tilstand, vil du få HVER række i din data_view UANSET, om der er en tilsvarende enhedsrække i B eller ej. Selvom du tilslutter dig på entity_id, vil venstre joinforbindelse bringe en række tilbage for hver række i T, selv uden en matchende række i B, fordi det er, hvad LEFT JOINs blev designet til at gøre.

Når det er sagt, bliver du nødt til at beslutte, om det er værd at blande disse to blokke. Bare fordi du KAN, betyder det ikke, at du BØR. Din præstation kan være bedre, hvis du forlader den, som du har den - kør nogle tests. Kun du kender mængden af ​​data og hyppigheden af ​​behandlingen. Du skal også overveje vedligeholdelsen af ​​din kode, da den næste fyr/gal skal finde ud af, hvad der foregår her.




  1. MySQL-fejl #1071 - Den angivne nøgle var for lang; max nøglelængde er 767 bytes

  2. Gendannelsesapparat til nul datatab

  3. Datokolonnearitmetik i PostgreSQL-forespørgsel

  4. Få indlejret objekt i struktur i Gorm