Oracle
 sql >> Baza danych >  >> RDS >> Oracle

wykonaj natychmiastową sekwencję zmiany nie działa

Oba alter sequence instrukcje działają, to wzrost pomiędzy nimi się nie dzieje. nextval wywołanie w pętli nie jest oceniane, ponieważ instrukcja select nigdzie nie wysyła swoich danych wyjściowych. Z dokumentacji , uwaga, która odnosi się dokładnie do tego, co robisz:

Musisz więc wybrać tę wartość do czegoś:

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

Dodałem val zmiennej i into val klauzula drugiego wykonania natychmiast.

Aby zademonstrować, że teraz działa:

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 klauzula, to wróciło z 1 zamiast 1001, co właśnie widzisz.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ograniczenie czeku Oracle

  2. Oracle PLSQL skraca daty i godziny do 15-minutowych bloków

  3. Formatowanie ciągu UUID bez REGEXP_REPLACE i PL/SQL

  4. Oracle DELETE sql z opcją JOIN nie działa

  5. Jak w Oracle 10g akceptować dane wprowadzane przez użytkownika w pętli?