plsql Prozedur repetitive Codezeile. versuchen, besser zu machen

Aug 21 2020

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

1 KayaNatsumi Aug 20 2020 at 22:10

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.