Oracle
 sql >> Database >  >> RDS >> Oracle

eseguire immediatamente altera sequenza non funzionante

Entrambi alter sequence le dichiarazioni funzionano, è l'incremento intermedio che non sta accadendo. Il nextval la chiamata nel tuo ciclo non viene valutata perché l'istruzione select non invia il suo output da nessuna parte. Da la documentazione , una nota che si riferisce esattamente a ciò che stai facendo:

Quindi devi selezionare quel valore in qualcosa:

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

Ho aggiunto un val variabile e un into val clausola sulla seconda esecuzione immediata.

Per dimostrare che ora funziona:

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 

Senza il into clausola, questo è tornato con 1 anziché 1001, che è quello che stai vedendo.