Oracle:将行类型数据插入另一个表
发布时间:2020-12-12 16:29:16 所属栏目:百科 来源:网络整理
导读:我有一个名为event的表,并创建了另一个全局临时表tmp_event,其中包含与事件相同的列和定义.是否可以使用此方法将事件中的记录插入tmp_event? DECLARE v_record event%rowtype;BEGIN Insert into tmp_event values v_record;END; 事件表中有太多列,我想尝试
我有一个名为event的表,并创建了另一个全局临时表tmp_event,其中包含与事件相同的列和定义.是否可以使用此方法将事件中的记录插入tmp_event?
DECLARE v_record event%rowtype; BEGIN Insert into tmp_event values v_record; END; 事件表中有太多列,我想尝试这个,因为我不想列出所有列. 忘了提一下:我会在触发器中使用它,这个v_record可以作为对象:在EVENT表上插入之后是新的吗? 插入一行 –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; 或者更复杂的版本来插入事件的所有行 – 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; / 在一个触发器中,是的,它可能,但它像鸡或鸡蛋.您必须使用:new列值初始化rowtype的每个字段,例如 – v_record.col1 := :new.col1; v_record.col2 := :new.col2; v_record.col3 := :new.col3; .... 显然,上面的PLSQL示例不能在触发器中使用,因为它会抛出一个变异的触发器错误.除了上面解释的那样,除了单独访问每一列之外,没有其他方法可以获取触发器中的整行,所以如果你这么做的话为什么不直接使用:new.col在INSERT中进入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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |