甲骨文:插入行类型的数据到另一个表(Oracle: Insert rowtype data into

2019-07-05 05:32发布

我有一个表称为事件 ,并创建了相同的列和定义与事件另一全局临时表tmp_event。 是否有可能在插入事件记录以此来tmp_event?

DECLARE
   v_record event%rowtype;
BEGIN 
   Insert into tmp_event values v_record;
END;

有在事件表中列数太多,我想试试这个,因为我不想列出所有列。

忘了提:我将在触发用这个,可以在此v_record是对象在事件表后插入新的

Answer 1:

要插入一个行向

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.colINSERT 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;


Answer 2:

还有就是要插入多行到表%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;


文章来源: Oracle: Insert rowtype data into another table