PLSQL:ORA-00904 err“无效的标识符”和PLS-00487错误,因为标识符无效且对变量'i'的引用无效

问题描述 投票:0回答:2

在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_outi.sin出现错误Invalid IdentifierInvalid reference to variable 'i'。我该如何解决此错误,以便记录可以快速插入。

sql oracle plsql bulkinsert
2个回答
0
投票

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 ... ;

0
投票

您必须如下使用集合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
© www.soinside.com 2019 - 2024. All rights reserved.