При изменении таблицы по условию CURRENT OF ошибка: ORA-01410: invalid ROWID
При выполнении скрипта приведённого ниже на Live SQL получаю ошибку:
ORA-01410: invalid ROWID
ORA-06512: at line 24
ORA-06512: at "SYS.DBMS_SQL", line 1721
Ведь курсор должен указывать на конкретный t2.rowid, разве я не прав?
Тестовые данные:
create table t1 (
id integer primary key,
val varchar2(100)
);
create table t2 (
id integer primary key,
gr_id integer,
val varchar2(100)
);
insert all
into t1 values (1, 'A')
into t1 values (2, 'B')
into t1 values (3, 'C')
into t2 values (1, 1, 'X11')
into t2 values (2, 1, 'X21')
into t2 values (3, 2, 'X32')
into t2 values (4, 2, 'X42')
into t2 values (5, 3, 'X53')
into t2 values (6, 3, 'X63')
select * from dual;
commit;
Сам скрипт:
declare
type t_rec is record (id integer, val t2.val%type);
s_rec t_rec;
cursor cur is
select t1.id, t2.val
from t1, t2
where t2.gr_id = t1.id
for update of t2.val nowait;
begin
open cur;
loop
exit when cur%notfound;
fetch cur into s_rec;
update t2 set val = val||' Y'
where current of cur;
end loop;
close cur;
end;
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
В последей итерации цикла, когда курсор закончился и вернул атрибут notfound=true, произходит попытка измененения таблицы с недействительным ROWID.
Условие на выход из цикла должно всегда проверятся сразу же после FETCH:
fetch cur into s_rec;
exit when cur%notfound;