PL SQL: ORA-00904, ошибка "Неверный идентификатор" и ошибка PLS-00487 в качестве Неверного идентификатора и Неверная ссылка на переменную "i" - PullRequest
0 голосов
/ 31 марта 2020

В операторе блока PL SQL будет выполняться операция DML. Я использую FORALL с BULK COLLECT. PL SQL оператор упоминается ниже -

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'. Как я могу устранить эту ошибку, чтобы запись была вставлена ​​быстро.

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Вы должны использовать индекс для коллекции 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
0 голосов
/ 31 марта 2020

Это v_rec(i).sin, а не i.sin.

Хотя вы говорите, что хотите, чтобы он работал быстрее. Почему вы выбрали подход, который делает его медленнее ? Вы используете курсор, петли, ... еще много чего.

Прямая вставка строк без участия PL / SQL (без необходимости):

insert into tab_out (sid, sin, ...)
  select b.sid, i.sin, ...
  from tab_a a join tab_b b on ...
  where ... ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...