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

udføre øjeblikkelig ændringssekvens virker ikke

Begge alter sequence udtalelser virker, det er stigningen derimellem, der ikke sker. nextval call in your loop bliver ikke evalueret, fordi select-sætningen ikke sender sit output nogen steder. Fra dokumentationen , en note, der tilfældigvis henviser til præcis, hvad du laver:

Så du skal vælge den værdi til noget:

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

Jeg har tilføjet en val variabel og en into val klausul på den anden udførelse med det samme.

For at demonstrere, at det virker nu:

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 

Uden into klausul, dette kom tilbage med 1 i stedet for 1001, hvilket er det, du ser.



  1. Indsæt data, hvis antallet af rækker er større end 0, virker ikke

  2. PHP-strengvariabel i WHERE-sætning MySQL

  3. Oracle JDBC PreparedStatement Ignorer efterfølgende mellemrum

  4. CAST vs ssis dataflow implicit konverteringsforskel