plsql Prozedur repetitive Codezeile. versuchen, besser zu machen
Ich habe ein Szenario. Wenn der Benutzer den Parameter Entity_typeübergibt, müssen Sie nur Daten für das entity( table) einfügen . Wenn er keinen Parameter übergibt, müssen Sie Daten für alle erforderlichen Tabellen in eine Tabelle einfügen.
Wir haben also eine Tabelle DYNAMICENTITYGTT, die Daten aus der ItemTabelle entnimmt, wenn sie übergeben werden, und eine orgTabelle, wenn sie übergeben wird. Es werden jedoch Daten aus beiden Tabellen übernommen, wenn der Entity_typeParameter in proc null ist.
Außerdem wird je nach Art der UPDATE_MODEMittel zum Hinzufügen oder Löschen eine weitere Spalte gespeichert . Die Zieltabelle ist dieselbe. Die Quelltabelle und ihr Spaltenname sind unterschiedlich, aber der Typ ist gleich.
Ich habe unten Verfahren für das gleiche geschrieben.
Ich bitte nur darum, dass es sowieso gibt, um diesen Code besser zu machen. Ich meine, kann das klüger geschrieben werden? Weil ich mehrere Zeilen wiederhole. Ich habe ein Beispiel für 2 Entitäten gegeben, aber es gibt 7, so dass der Code riesig wäre.
CREATE OR REPLACE procedure UPDATE_DYNAMIC_ENTITY(ENTITY_TYPE varchar2 default null,UPDATE_MODE varchar2)
Is
x number;
BEGIN
IF UPPER(entity_type)='ITEM' then
if upper(UPDATE_MODE)='DELETE' then
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,Item_id,item_name,item_desc,'delete' from ITEMDE;
ELSIF lower(UPDATE_MODE)='add' then
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,Item_id,item_name,item_desc,'add' from ITEMDE;
END IF;
ELSIF UPPER(entity_type)='ORG' then
if upper(UPDATE_MODE)='DELETE' then
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,ORG_id,org_name,org_desc,'delete' from ORGDE;
ELSIF lower(UPDATE_MODE)='add' then
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,ORG_id,org_name,org_desc,'add' from ORGDE;
END IF;
ELSE
if upper(UPDATE_MODE)='DELETE' then
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,Item_id,item_name,item_desc,'delete' from ITEMDE;
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,ORG_id,org_name,org_desc,'delete' from ORGDE;
ELSIF lower(UPDATE_MODE)='add' then
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,Item_id,item_name,item_desc,'add' from ITEMDE;
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,ORG_id,org_name,org_desc,'add' from ORGDE;
END IF;
END IF;
END UPDATE_DYNAMIC_ENTITY;
Antworten
Grundsätzlich sehe ich zwei Einfügungen mit zwei Variablen, die den Inhalt bestimmen. Sie fügen aus der select-Anweisung ein, daher können Sie diese selects so bearbeiten, dass keine Werte zurückgegeben werden, wenn die Bedingungen nicht den Erwartungen entsprechen.
Für Parameter ist p_update_modees einfach, wenn er den Wert "delete" enthält, "delete" einzufügen, wenn er den Wert "add" enthält "insert" add ".
Für Parameter p_entity_typefügen wir aus beiden Auswahlen ein, wenn der Wert "NULL" ist, nur aus der itemdeTabelle, wenn der Wert "ITEM" ist, und nur aus der orgdeTabelle, wenn der Wert "ORG" ist.
Falls nun in p_entity_typekeiner der Auswahlen ein ungültiger Wert vorhanden ist , werden Daten erzeugt, da nur "NULL", "ITEM" und "ORG" erkannt werden. Für Parameter p_update_modeändern wir den Wert jedoch direkt und verwenden ihn beim Einfügen. Daher ist es besser, eine Überprüfung durchzuführen, ob der Eingabewert für uns gültig ist.
CREATE OR REPLACE PROCEDURE update_dynamic_entity(p_entity_type VARCHAR2 DEFAULT NULL,
p_update_mode VARCHAR2) IS
BEGIN
IF lower(p_update_mode) NOT IN ('add', 'delete')
THEN
RAISE VALUE_ERROR; -- maybe use raise_application_error for more details about problem
END IF;
--
INSERT INTO dynamicentitygtt
(entity_type, entity_id, entity_code, synonyms, action)
SELECT upper(NVL(p_entity_type, 'ITEM')), item_id, item_name, item_desc, lower(p_update_mode)
FROM itemde
WHERE upper(p_entity_type) = 'ITEM'
OR p_entity_type IS NULL;
--
INSERT INTO dynamicentitygtt
(entity_type, entity_id, entity_code, synonyms, action)
SELECT upper(NVL(p_entity_type, 'ORG')), org_id, org_name, org_desc, lower(p_update_mode)
FROM orgde
WHERE upper(p_entity_type) = 'ORG'
OR p_entity_type IS NULL;
END update_dynamic_entity;
Während Sie schreiben, haben Sie 7 Entitäten, daher würde dieser Ansatz zu 7 Einfügungen führen, da ich glaube (und mich wissen lassen, wenn ich falsch liege), dass jede Entität ihren eigenen Datensatz in verschiedenen Tabellen hat.
Es besteht auch die Möglichkeit, alle diese Tabellen zu verknüpfen und als Beispiel unten in eine einzelne Einfügung umzuwandeln. Jede neue Entität würde bedeuten, dass nur eine neue Auswahl in einen WITHTeil der Anweisung eingefügt wird. Über die Leistung in diesem Fall bin ich mir jedoch nicht sicher. Das hängt davon ab, wie voll Ihre Tische sind.
CREATE OR REPLACE PROCEDURE update_dynamic_entity(p_entity_type VARCHAR2 DEFAULT NULL,
p_update_mode VARCHAR2) IS
BEGIN
IF lower(p_update_mode) NOT IN ('add', 'delete')
THEN
RAISE VALUE_ERROR; -- maybe use raise_application_error for more details about problem
END IF;
--
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
FROM itemde
UNION ALL
-- ORG table
SELECT 'ORG' entity_type, -- This separates inserted values
org_id,
org_name,
org_desc
FROM orgde
-- NEXT entity table
)
SELECT upper(entity_type), data_id, data_name, data_desc, lower(p_update_mode)
FROM data_view
WHERE upper(p_entity_type) = entity_type
OR p_entity_type IS NULL;
END update_dynamic_entity;
Und selbst wenn dies für Sie unübersichtlich wird, können Sie eine Stelle erstellen, VIEWan der Sie die UNIONs ausführen, und diese WITHaus PROCEDUREund mit neuen Entitäten entfernen, in die VIEWanstelle von Auswahlen hinzugefügt wird PROCEDURE.