Oracle
 sql >> Base de données >  >> RDS >> Oracle

exécuter la séquence de modification immédiate ne fonctionne pas

Les deux alter sequence les déclarations fonctionnent, c'est l'incrément entre les deux qui ne se produit pas. Le nextval call dans votre boucle n'est pas évalué car l'instruction select n'envoie sa sortie nulle part. Depuis la documentation , une note qui fait référence exactement à ce que vous faites :

Vous devez donc sélectionner cette valeur dans quelque chose :

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;
/

J'ai ajouté un val variable, et un into val clause sur la deuxième exécution immédiate.

Pour démontrer que cela fonctionne maintenant :

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 

Sans le into clause, cela revient avec 1 plutôt que 1001, ce que vous voyez.