sql >> Database >  >> RDS >> Oracle

onmiddellijke wijzigingsreeks uitvoeren werkt niet

Beide alter sequence verklaringen werken, het is de tussenstap die niet gebeurt. De nextval call in uw lus wordt niet geëvalueerd omdat de select-instructie de uitvoer nergens naartoe stuurt. Van de documentatie , een notitie die precies verwijst naar wat u aan het doen bent:

Dus je moet die waarde ergens in selecteren:

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

Ik heb een val toegevoegd variabele, en een into val clausule op de tweede uitvoering onmiddellijk.

Om aan te tonen dat het nu werkt:

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 

Zonder de into clausule, dit kwam terug met 1 in plaats van 1001, wat je ziet.



  1. Wachtwoorden voor MYSQL op een veilige manier opslaan in de PHP-toepassing

  2. Berichtensysteem in php mysql

  3. SQL Server Profiler - Hoe filtert u tracering om alleen gebeurtenissen uit één database weer te geven?

  4. Vind records met overlappende periode in SQL