Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle:Zeilentypdaten in eine andere Tabelle einfügen

Um eine Zeile einzufügen-

DECLARE
   v_record event%rowtype;
BEGIN 
   SELECT * INTO v_record from event where rownum=1; --or whatever where clause
   Insert into tmp_event values v_record;
END;

Oder eine ausgefeiltere Version, um alle Zeilen von event einzufügen -

DECLARE
  TYPE t_bulk_collect_test_tab IS TABLE OF event%ROWTYPE;

  l_tab t_bulk_collect_test_tab;

  CURSOR c_data IS
    SELECT *
    FROM event;
BEGIN
  OPEN c_data;
  LOOP
    FETCH c_data
    BULK COLLECT INTO l_tab LIMIT 10000;
    EXIT WHEN l_tab.count = 0;

    -- Process contents of collection here.
    Insert into tmp_event values v_record;
  END LOOP;
  CLOSE c_data;
END;
/

Bei einem Trigger ist es möglich, aber es ist wie das Huhn oder das Ei. Sie müssen jedes Feld des rowtype initialisieren mit dem :new Spaltenwerte wie-

v_record.col1 := :new.col1;
v_record.col2 := :new.col2;
v_record.col3 := :new.col3;
....

Anscheinend können die obigen PLSQL-Beispiele nicht in einem Trigger verwendet werden, da dies einen mutierenden Triggerfehler auslösen würde. Und es gibt keine andere Möglichkeit, die gesamte Zeile im Trigger zu erhalten, als auf jede Spalte einzeln zuzugreifen, wie ich oben erklärt habe. Wenn Sie also all dies tun, warum verwenden Sie nicht direkt :new.col im INSERT into temp_event selbst, wird Ihnen viel Arbeit ersparen.

Auch da Sie sagen, dass es eine Menge Arbeit ist, alle Spalten zu erwähnen (in Oracle 11gR2 ) ist hier eine schnelle Möglichkeit, dies zu tun, indem Sie den INSERT generieren -Anweisung und dynamischer Ausführung (obwohl nicht auf Leistung getestet).

CREATE OR REPLACE TRIGGER event_air --air stands for "after insert of row"
AFTER INSERT ON EVENT
FOR EACH ROW
   L_query varchar2(2000);   --size it appropriately
BEGIN

   SELECT 'INSERT INTO tmp_event VALUES ('|| listagg (':new.'||column_name, ',') 
                                           WITHIN GROUP (ORDER BY column_name) ||')' 
     INTO l_query
     FROM all_tab_columns
    WHERE table_name='EVENT';

   EXECUTE IMMEDIATE l_query;

EXCEPTION
    WHEN OTHERS THEN
        --Meaningful exception handling here
END;