在 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 循环时,是不是需要事后提交?
Oracle PL/SQL 如何输出在 FORALL 语句中进行了多少次插入