(ЗАБЕЛЕЖКА:този код не е тестван и може да съм извън запетая тук или скоба там...)
Тези два блока изглежда се различават само в колоната за действие и съединението, така че можете да елиминирате 2-те крака IF и да преместите проверката на p_update_mode в оператор CASE като този:
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;
Заявката във вашия блок FULL казва, че не трябва да се присъединяваме към B в този режим. Така че клаузата LEFT JOIN връща редове само когато е в режим INCREMENTAL, но не трябва да произвежда редове за режим FULL.
Това трябва да е ЛЯВО съединение или може да не получим никакви редове от вашия data_view, които не съответстват на обекти в B за режим FULL. С други думи, ако това остане обикновен JOIN, цялостната ви заявка ще получи нула редове в режим FULL поради клаузата AND в съединението.
И накрая, филтърът AND в клаузата WHERE в долната част става необходим сега, когато има LEFT JOIN. Без това, когато работите в режим INCREMENTAL, ще получите ВСЕКИ ред във вашия data_view НЕЗАВИСИМО дали има съответен ред на обект в B или не. Въпреки че се присъединявате към entity_id, лявото съединение ще върне ред обратно за всеки ред в T дори без съответстващ ред в B, защото това е, което LEFT JOINs са предназначени да правят.
Всичко казано дотук, ще трябва да решите дали си струва да смесите тези два блока. Това, че МОЖЕШ, не означава, че ТРЯБВА. Представянето ви може да е по-добро, ако го оставите така, както го имате – направете някои тестове. Само вие знаете обема на данните и честотата на обработка. Трябва също така да обмислите поддръжката на вашия код, тъй като следващият човек/момиче ще трябва да разбере какво става тук.