востановить последовательность???

z Serg
Дата: 04.12.2012 12:22:12
Добрый день. непойму в чем загвоздка.

написал процедурку которая должна востанавливать последовательность
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
OracleX
Дата: 04.12.2012 12:36:10
Попробуйте процедуру от Viewer 9691949
Sayan Malakshinov
Дата: 04.12.2012 12:41:36
z Serg
      vSql:='select "SEQ_' || T_Name || '".nextval from dual';
    dbms_output.put_line (vSql);
      execute immediate vSql into ...;
И раз у вас есть currval, то в случае если есть и кэш, то его тоже надо прибавлять или отключать как у Viewer