加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读