我有一个表称为事件 ,并创建了相同的列和定义与事件另一全局临时表tmp_event。 是否有可能在插入事件记录以此来tmp_event?
DECLARE
v_record event%rowtype;
BEGIN
Insert into tmp_event values v_record;
END;
有在事件表中列数太多,我想试试这个,因为我不想列出所有列。
忘了提:我将在触发用这个,可以在此v_record是对象:在事件表后插入新的 ?
我有一个表称为事件 ,并创建了相同的列和定义与事件另一全局临时表tmp_event。 是否有可能在插入事件记录以此来tmp_event?
DECLARE
v_record event%rowtype;
BEGIN
Insert into tmp_event values v_record;
END;
有在事件表中列数太多,我想试试这个,因为我不想列出所有列。
忘了提:我将在触发用这个,可以在此v_record是对象:在事件表后插入新的 ?
要插入一个行向
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上面的例子不能在触发器使用,因为它会抛出一个突变触发错误。 还有就是让你获得比单独访问每个列其他触发整个行没有别的办法,因为我上面解释,所以如果你做这一切,为什么不直接使用:new.col
在INSERT into temp_event
本身,将节省你大量的工作。
此外,由于你说这是一个大量的工作,更何况所有列,(在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;
还有就是要插入多行到表%Rowtyp E中的方式。
结帐下面的例子。
DECLARE
TYPE v_test IS TABLE OF TEST_TAB%rowtype;
v_test_tab v_test ;
EXECUTE immediate ' SELECT * FROM TEST_TAB ' bulk collect INTO v_test_tab ;
dbms_output.put_line('v_test_tab.count -->'||v_test_tab.count);
FOR i IN 1..v_test_tab.count
LOOP
INSERT INTO TEST_TAB_1 VALUES v_test_tab
(i
) ;
END LOOP;
END;