Rownum - псевдоколонка. Он присваивается строкам, когда они возвращаются из выбора. Таким образом, вы не можете сказать «выбрать * из my_table, где rownum = 42», поскольку строка с rownum = 42 еще не определена, она будет меняться в зависимости от вашего выбора и предиката (и «выбрать * из my_table, где rownum = 1 "вернет одну строку, а не" первую "строку, что бы это ни было). Вы можете сделать что-то вроде (не проверено):
declare
cursor sel_cur is
select rowid as row_id
from my_table
order by orderby_col;
v_ctr pls_integer := 0;
begin
for rec in sel_cur
loop
v_ctr := v_ctr + 1;
update my_table set pk_col = v_ctr where rowid = rec.row_id;
end loop;
commit;
exception
when others then
rollback;
raise;
end;
Предполагается, что у вас достаточно отката для обновления всей таблицы.
Надеюсь, это поможет.