要插入一個行向
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;
或者更詳盡的版本,從event
插入所有行 -
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;
/
在觸發,是有可能的,但它像先有雞還是蛋。你必須在rowtype
與:new
列值的各個領域初始化喜歡 -
v_record.col1 := :new.col1;
v_record.col2 := :new.col2;
v_record.col3 := :new.col3;
....
顯然,PLSQL上面的例子不能在觸發器使用,因爲它會拋出一個突變觸發錯誤。除了上面解釋的單獨訪問每列外,沒有其他方式可以讓整行訪問觸發器,所以如果你這樣做,爲什麼不直接在INSERT into temp_event
本身中直接使用:new.col
,將爲您節省大量工作。
而且因爲你說這是一個大量的工作,更何況所有列,(在的Oracle 11gR2中)這裏是這樣做,通過生成INSERT
聲明和動態執行它(儘管不是用於測試的快捷方式性能)。
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;
更新了在'trigger'中使用的答案。 – Annjawn
我在這裏回答了類似的問題:http://stackoverflow.com/a/26343423/2235483][1] [1]:http://stackoverflow.com/a/26343423/2235483 – Rusty