Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Ausführen einer sofortigen Änderungssequenz funktioniert nicht

Beide alter sequence Anweisungen funktionieren, es ist das Inkrement dazwischen, das nicht passiert. Das nextval Aufruf in Ihrer Schleife wird nicht ausgewertet, da die select-Anweisung ihre Ausgabe nirgendwohin sendet. Aus der Dokumentation , eine Notiz, die sich genau auf das bezieht, was Sie gerade tun:

Sie müssen diesen Wert also in etwas auswählen:

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

Ich habe ein val hinzugefügt Variable und ein into val Klausel auf der zweiten sofort ausführen.

Um zu demonstrieren, dass es jetzt funktioniert:

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 

Ohne into Klausel, kam dies mit 1 statt 1001 zurück, was Sie sehen.