Performance 在PL/SQL中的FORALL循环中插入

Performance 在PL/SQL中的FORALL循环中插入,performance,plsql,forall,Performance,Plsql,Forall,在pl/sql中,是否可以使用FORALL对大容量插入执行类似操作 TYPE c_type1 IS RECORD ( column1 table1.column1%TYPE, column2 table1.column2%TYPE, client table2.client%TYPE ); type1 c_type1; CURSOR cur_t IS select * BULK COLLECT INTO recs from table3 ; begin FOR recs IN cur_

在pl/sql中,是否可以使用
FORALL
对大容量插入执行类似操作

TYPE c_type1 IS RECORD
(
column1 table1.column1%TYPE,
column2 table1.column2%TYPE,
client table2.client%TYPE
);
type1 c_type1;

CURSOR cur_t IS  select * BULK COLLECT INTO recs from table3 ;

begin
  FOR recs IN cur_t
  LOOP

  SELECT * INTO type1 FROM  (select a.column1, a.column2,imm.client 
  ...
    from table1 a, table2 imm        
   WHERE 
    a.column1 = recs.column1
  ) WHERE ROWNUM=1;

  INSERT INTO table2 values (recs.column1,type1.column2);

  ...

附言:还有80多列要插入。

你的问题不太清楚,但看看你的代码,我有以下几行。检查这是否是你要找的

declare

CURSOR cur_t IS  
                select t3.column1 , t1.column2
                from table3 t3
                inner join table1 t1
                on t3.column1 = t1.column1;

type var_cur is table of cur_t%rowtype;

var var_cur;

begin

open cur_t;

  LOOP

    FETCH cur_t bulk collect into var limit 100;       
     EXIT WHEN cur_t%NOTFOUND;

     FORALL i IN 1 .. var.count SAVE EXCEPTIONS
      INSERT INTO TABLE2 
     VALUES var(i);         

    END LOOP;

  CLOSE distinctUserIdCursor;

COMMIT;

EXCEPTION
    WHEN OTHERS THEN
        dbms_output.put_line('Error in Insertion of record' || '~~~~' || SQLERRM);
      FOR indx IN 1 .. SQL%BULK_EXCEPTIONS.COUNT
         LOOP
            DBMS_OUTPUT.put_line (SQL%BULK_EXCEPTIONS (indx).ERROR_INDEX|| ': '
               || SQL%BULK_EXCEPTIONS (indx).ERROR_CODE);
      END LOOP;

end;

你可以用这种方式使用forall@如果您注意到,请输入..插入表2中的值(记录column1,类型1.column2);我必须插入两个表中的记录。表3使用了什么..为什么要运行循环。问题不清楚。表命名不正确。游标声明没有任何
into
子句,并且
recs
数组没有在任何地方声明,尽管游标为循环隐式声明了一条
recs
记录。我真的搞不懂。试着把你的问题格式化。它们必须对我们有意义。在问下一个问题之前,请先阅读。对于type1..中每个匹配的REC记录,应该只有1条记录..内部联接可能会创建2个条目a.column1=recs.column1),其中ROWNUM=1;好的,以我的代码为框架,实现你的逻辑。我希望它能起作用。我解释了如何使用forall。