Добрый день. непойму в чем загвоздка.
написал процедурку которая должна востанавливать последовательность
create or replace procedure RecoverSeq(T_Name in varchar2) is
MaxID Number(10);
vSql Varchar2(32767);
Cursor CurSeq(p_Name Varchar2,pMaxID Number) is
select 'alter sequence "SEQ_' || p_Name || '" increment by ' || (s.mni - s.last_number) sql1,
'select "SEQ_' || p_Name || '".nextval from dual' sql2,
'alter sequence "SEQ_' || p_Name || '" increment by 1' sql3,
s.mni - s.last_number numSeq
from (select ds.sequence_name, ds.last_number, pMaxID mni
from sys.dba_sequences ds
where ds.sequence_owner = 'OILLOST' and 'SEQ_' || p_Name = ds.sequence_name) s
where s.mni is not null and s.mni > 0 and s.mni > s.last_number;
begin
execute immediate('select max(ID) from '||T_Name) into MaxID;
FOR recSeq IN CurSeq(T_Name, MaxID) LOOP
vSql:='alter sequence "SEQ_' || T_Name || '" increment by '||recSeq.Numseq;
dbms_output.put_line (vSql);
execute immediate vSql;
vSql:='select "SEQ_' || T_Name || '".nextval from dual';
dbms_output.put_line (vSql);
execute immediate vSql;
vSql:='alter sequence "SEQ_' || T_Name || '" increment by 1';
dbms_output.put_line (vSql);
execute immediate vSql;
END LOOP;
end RecoverSeq;
но вот считает правильно, а обновлять не хочет.
Вот тестовый прогон
select Seq_RNU.currval from dual;
CURRVAL
----------
0
Executed in 0,032 seconds
SQL> exec recoverseq('RNU');
alter sequence "SEQ_RNU" increment by 4
select "SEQ_RNU".nextval from dual
alter sequence "SEQ_RNU" increment by 1
PL/SQL procedure successfully completed
Executed in 0,031 seconds
SQL> select Seq_RNU.currval from dual;
CURRVAL
----------
0
Executed in 0,062 seconds
хотя если вычисленные запросы запустить напрямую не из процедуры все вроде кк надо работает.
Почему не срабатывает
execute immediate