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;