Eén rij invoegen-
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;
Of een meer uitgebreide versie om alle rijen van event
in te voegen -
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;
/
In een trigger, ja het is mogelijk, maar het is als de kip of het ei. U moet elk veld van het rowtype
initialiseren met de :new
kolomwaarden zoals-
v_record.col1 := :new.col1;
v_record.col2 := :new.col2;
v_record.col3 := :new.col3;
....
Blijkbaar kunnen de bovenstaande PLSQL-voorbeelden niet in een trigger worden gebruikt, omdat dit een muterende trigger-fout zou veroorzaken. En er is geen andere manier om de hele rij in de trigger te krijgen, behalve door elke kolom afzonderlijk te openen, zoals ik hierboven heb uitgelegd, dus als je dit allemaal doet, waarom gebruik je dan niet rechtstreeks :new.col
in de INSERT into temp_event
zelf, bespaart u veel werk.
Ook omdat je zegt dat het veel werk is om alle kolommen te noemen, (in Oracle 11gR2 ) hier is een snelle manier om dat te doen door de INSERT
. te genereren statement en het dynamisch uitvoeren (hoewel niet getest op prestaties).
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;