Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

executar imediatamente alterar a sequência não está funcionando


Ambos alter sequence instruções estão funcionando, é o incremento no meio que não está acontecendo. O nextval call em seu loop não está sendo avaliada porque a instrução select não está enviando sua saída para nenhum lugar. Da da documentação , uma nota que se refere exatamente ao que você está fazendo:

Então você precisa selecionar esse valor em algo:
declare
 st VARCHAR(1024);
 val number;
begin
  for x in (SELECT sequence_name FROM USER_SEQUENCES) loop
      st := 'ALTER SEQUENCE ' || x.sequence_name ||  ' INCREMENT BY 1000';
      execute immediate st;
      st := 'select ' || x.sequence_name ||  '.nextval from dual';
      execute immediate st into val;
      st := 'ALTER SEQUENCE ' || x.sequence_name ||  ' INCREMENT BY 1';
      execute immediate st;
  end loop;
end;
/

Eu adicionei um val variável e um into val cláusula na segunda execução imediata.

Para demonstrar que funciona agora:
create sequence s42;

Sequence s42 created.

declare
 st VARCHAR(1024);
 n number;
begin
  for x in (SELECT sequence_name FROM USER_SEQUENCES) loop
      st := 'ALTER SEQUENCE ' || x.sequence_name ||  ' INCREMENT BY 1000';
      execute immediate st;
      st := 'select ' || x.sequence_name ||  '.nextval from dual';
      execute immediate st into n;
      st := 'ALTER SEQUENCE ' || x.sequence_name ||  ' INCREMENT BY 1';
      execute immediate st;
  end loop;
end;
/

anonymous block completed

select s42.nextval from dual;

   NEXTVAL
----------
      1001 

Sem o into cláusula, isso voltou com 1 em vez de 1001, que é o que você está vendo.