在PLSQL块语句中,将执行DML操作。我将FORALL与BULK COLLECT结合使用。 PLSQL语句在下面提到-
declare
v_sub tab_a%rowtype;
v_res varchar2(50);
type v_rec_tbl is table of tab_out%rowtype;
v_rec v_rec_tbl;
cursor C is select b.sid, a.sin, 'N', SYSDATE from tab_a a, tab_b b;
begin
open C;
fetch C bulk collect into v_rec limit 1000;
for i in (select a.sin from tab_a a, tab_b b where b.sid = .....)
loop
select * into v_sub from tab_a where sin = i.sin;
end loop;
FORALL i in v_rec.FIRST..v_rec.LAST
insert into tab_out
select b.sid, i.sin, 'N', SYSDATE from tab_a a, tab_b b where b.sid = ......;
commit;
close C;
end;
/
当我在PL / SQL语句上方执行时,在ORA-00904
中的行PLS-00487
处以insert into tab_out
和i.sin
出现错误Invalid Identifier
和Invalid reference to variable 'i'
。我该如何解决此错误,以便记录可以快速插入。
是v_rec(i).sin
,不是i.sin
。
尽管,您是在说要使其运行更快。您为什么选择使其成为slower的方法?您使用游标,循环等等。
直接插入行,不涉及PL / SQL(除非必要):
insert into tab_out (sid, sin, ...)
select b.sid, i.sin, ...
from tab_a a join tab_b b on ...
where ... ;
您必须如下使用集合v_rec
上的索引:
FORALL idx in 1..v_rec.COUNT -- changes here
insert into tab_out
select b.sid, v_rec(idx).sin, 'N', SYSDATE from tab_a a, tab_b b where b.sid = ......;
-- see the usage of the idx