(POZNÁMKA:tento kód není testován a může být mimo čárku nebo závorku tam...)
Zdá se, že tyto dva bloky se liší pouze ve sloupci akce a spojení, takže byste mohli odstranit 2 větve IF a přesunout kontrolu p_update_mode do příkazu CASE, jako je tento:
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;
Dotaz ve vašem FULL bloku říká, že bychom se v tomto režimu neměli připojit k B. Klauzule LEFT JOIN tedy vrací řádky zpět pouze v režimu INCREMENTAL, ale neměla by vytvářet žádné řádky pro režim FULL.
Toto musí být LEVÉ spojení, jinak nemusíme z vašeho data_view získat žádné řádky, které neodpovídají entitám v B pro režim FULL. Jinými slovy, pokud by to zůstalo jako normální JOIN, váš celkový dotaz by v režimu FULL získal nula řádků kvůli klauzuli AND ve spojení.
A konečně, filtr AND v klauzuli WHERE ve spodní části je nyní nezbytný, když existuje LEFT JOIN. Bez toho byste při spuštění v INCREMENTAL režimu dostali KAŽDÝ řádek ve vašem data_view BEZ OHLEDU na to, zda je v B odpovídající řádek entity nebo ne. I když se připojujete na entity_id, levé spojení vrátí řádek zpět pro každý řádek v T i bez shodného řádku v B, protože k tomu byly navrženy LEFT JOINy.
Vše, co bylo řečeno, budete se muset rozhodnout, zda stojí za to smíchat tyto dva bloky. To, že MŮŽETE, neznamená, že MUSÍTE. Váš výkon může být lepší ponechat to tak, jak to máte – proveďte nějaké testy. Pouze vy znáte objem dat a frekvenci zpracování. Musíte také zvážit údržbu svého kódu, protože další chlap/holka bude muset zjistit, co se tady děje.