(HINWEIS:Dieser Code ist ungetestet und ich kann hier ein Komma oder eine Klammer dort weglassen...)
Diese beiden Blöcke scheinen sich nur in der Aktionsspalte und einem Join zu unterscheiden, sodass Sie die beiden IF-Zweige eliminieren und die Überprüfung von p_update_mode in eine CASE-Anweisung wie diese verschieben könnten:
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;
Die Abfrage in Ihrem FULL-Block besagt, dass wir in diesem Modus nicht mit B verbinden sollten. Die LEFT JOIN-Klausel bringt also nur Zeilen zurück, wenn sie sich im INCREMENTAL-Modus befindet, sollte aber keine Zeilen für den FULL-Modus erzeugen.
Dies muss ein LEFT-Join sein oder wir erhalten möglicherweise keine Zeilen aus Ihrer data_view, die nicht den Entitäten in B für den FULL-Modus entsprechen. Mit anderen Worten, wenn dies ein regulärer JOIN bleiben würde, würde Ihre Gesamtabfrage aufgrund der AND-Klausel im Join null Zeilen im FULL-Modus erhalten.
Schließlich wird der AND-Filter in der WHERE-Klausel unten notwendig, da es einen LEFT JOIN gibt. Ohne dies würden Sie beim Ausführen im INCREMENTAL-Modus JEDE Zeile in Ihrer data_view erhalten, UNGEACHTET davon, ob es eine entsprechende Entitätszeile in B gibt oder nicht. Auch wenn Sie bei der Entität_id beitreten, bringt der linke Join eine Zeile für jede Zeile in T zurück, auch ohne eine passende Zeile in B, denn dafür wurden LEFT JOINs entwickelt.
Alles in allem müssen Sie entscheiden, ob es sich lohnt, diese beiden Blöcke zu mischen. Nur weil Sie KÖNNEN, heißt das nicht, dass Sie SOLLTEN. Ihre Leistung ist möglicherweise besser, wenn Sie es so lassen, wie Sie es haben. Führen Sie einige Tests durch. Nur Sie kennen das Datenvolumen und die Häufigkeit der Verarbeitung. Sie müssen auch die Wartung Ihres Codes in Betracht ziehen, da der nächste Typ/die nächste Frau herausfinden muss, was hier vor sich geht.