代码之家  ›  专栏  ›  技术社区  ›  LiborStefek

使用FORALL和RETURNING插入表时如何获取ROWID

  •  0
  • LiborStefek  · 技术社区  · 8 年前

    我想使用RETURNING子句从FORALL INSERT语句(大容量插入)获取插入记录的ROWID,并将其返回到pl/sql记录表(记录的关联数组)中。

    参见示例:

    CREATE TABLE test2 (num NUMBER);
    set serveroutput on
    
    DECLARE
      TYPE r_rec IS RECORD (num NUMBER, row_id ROWID);
    --  TYPE t_rid IS TABLE OF rowid INDEX BY BINARY_INTEGER;
      TYPE t_tab IS TABLE OF r_rec INDEX BY BINARY_INTEGER;
      v_tab     t_tab;
      --v_rid     t_rid;
    BEGIN
      v_tab(1).num := 1.11;
      v_tab(2).num := 2.22;
      v_tab(3).num := 3.33;
      --
      FORALL i IN v_tab.first..v_tab.last
        INSERT INTO test2 (num)
        VALUES (v_tab(i).num)
        RETURNING rowid BULK COLLECT INTO v_tab(i).row_id
      ;
      FOR i IN v_tab.first..v_tab.last
      LOOP
         dbms_output.put_line('num/rowid : ' || v_tab(i).num || '/' || v_tab(i).row_id);
      END LOOP;
    END;
    /
    

    这会引发错误: 这里哪里有问题?我是否需要另一个PL/SQL表来返回rowid?

    1 回复  |  直到 8 年前
        1
  •  2
  •   XING    8 年前

    我是否需要另一个PL/SQL表来返回rowid?

    DECLARE
      TYPE r_rec IS RECORD (num NUMBER, row_id ROWID);
    
      TYPE t_tab IS TABLE OF r_rec INDEX BY BINARY_INTEGER;
      v_tab     t_tab;
    
      TYPE r_rw IS TABLE OF ROWID index by pls_integer;
    
      v_rw r_rw;
    
    BEGIN
      v_tab(1).num := 1.11;
    
      v_tab(2).num := 2.22;
    
      v_tab(3).num := 3.33;
    
      --
      FORALL i IN v_tab.first..v_tab.last
        INSERT INTO test2 (num)
        VALUES (v_tab(i).num)
        RETURNING rowid BULK COLLECT INTO v_rw;
    
      FOR i IN v_tab.first..v_tab.last
      LOOP
         dbms_output.put_line('num/rowid : ' || v_tab(i).num || '/' ||v_rw(i));
      END LOOP;
    
    END;
    /