sql >> Databáze >  >> RDS >> Oracle

spustit okamžitou změnu sekvence nefunguje

Oba alter sequence příkazy fungují, je to přírůstek mezi tím, co se neděje. nextval volání ve vaší smyčce není vyhodnocováno, protože příkaz select nikam neposílá svůj výstup. Z dokumentace , poznámka, která přesně odkazuje na to, co děláte:

Takže musíte tuto hodnotu do něčeho vybrat:

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

Přidal jsem val proměnnou a into val klauzule na druhé provést okamžitě.

Chcete-li ukázat, že to nyní funguje:

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 

Bez into klauzule, toto se vrátilo s 1 místo 1001, což je to, co vidíte.



  1. Automatizujte většinu aktualizačních dotazů v pl\sql

  2. vložit do problému mysql

  3. Android Pushing Updates v Obchodě Play

  4. Importujte soubor výpisu MySQL do MSSQL