在 PL/SQL 的 FORALL 循环内插入

Posted

技术标签:

【中文标题】在 PL/SQL 的 FORALL 循环内插入【英文标题】:Insert within FORALL loop in PL/SQL 【发布时间】:2016-09-13 08:31:17 【问题描述】:

是否可以在 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);

  ...

P.S : 还有 80 列要插入。

【问题讨论】:

这样就可以使用forall了。 psoug.org/snippet/FORALL-Insert_499.htm @XING 如果您注意到 ..INSERT INTO table2 值 (recs.column1,type1.column2);我必须从两个表中插入记录。 什么表 3 使用..为什么你运行循环。问题不清楚..表命名不正确 游标声明没有任何into 子句,并且recs 数组没有在任何地方声明,尽管游标FOR 循环隐式声明了recs 记录。我真的无法确定它的头或尾。 努力格式化你的问题。它们必须对我们有意义。在提出下一个问题之前,请阅读***.com/help/how-to-ask。 【参考方案1】:

您的问题不是很清楚,但查看您的代码,我有以下内容。检查这是否是您要查找的内容。

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;

【讨论】:

对于 type1 中每条记录的匹配记录 ..应该只有 1 条记录 ..内连接可能会创建 2 个条目 a.column1 = recs.column1 ) WHERE ROWNUM=1; 好吧..拿我的代码骨架并实现你的逻辑。我希望它应该工作。我解释了如何使用 forall。

以上是关于在 PL/SQL 的 FORALL 循环内插入的主要内容,如果未能解决你的问题,请参考以下文章

在 PL/SQL 中运行 forall 循环时,是不是需要事后提交?

使用 PL/SQL 使用 forall 语法批量插入

Oracle PL/SQL 如何输出在 FORALL 语句中进行了多少次插入

Oracle pl/sql forall:如何计算表空间已满(1654)错误的实际插入行数

oracle pl/sql FORALL 语句

在 PL/SQL Oracle 中将 FOR 语句转换为 FORALL