sql >> Base de Datos >  >> RDS >> Oracle

ejecutar secuencia de alteración inmediata no funciona

Ambos alter sequence las declaraciones están funcionando, es el incremento intermedio lo que no está sucediendo. El nextval la llamada en su bucle no se está evaluando porque la declaración de selección no está enviando su salida a ninguna parte. De la documentación , una nota que se refiere exactamente a lo que estás haciendo:

Por lo tanto, debe seleccionar ese valor en 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;
/

He agregado un val variable, y un into val cláusula en la segunda ejecución inmediata.

Para demostrar que funciona ahora:

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 

Sin el into cláusula, esto volvió con 1 en lugar de 1001, que es lo que está viendo.