Utworzenie sekwencji z wartością początkową pobraną z tabeli

Utworzenie sekwencji z wartością początkową pobraną z tabeli
DH
  • Rejestracja: dni
  • Ostatnio: dni
0

Witam,
chciałbym utworzyć sekwencję z wartością początkową pobraną z tabeli...
czyli coś ala to:

Kopiuj
create sequence tabela_seq
start with select max(id) from tabela
increment by 1
maxvalue 999999;

Za każdą pomoc z góry dziękuję :)

DH
  • Rejestracja: dni
  • Ostatnio: dni
0

Rozwiązanie na jakie wpadłem:

Kopiuj
create sequence tabela_seq
start with 1
increment by 1
maxvalue 999999;


declare
cur number;
seq number;
begin
select max(id) into cur from tabela;
if cur is null then
cur:=1;
end if;

select tabela_seq.nextval into seq from dual;
while cur > seq loop
select tabela_seq.nextval into seq from dual;
end loop;
end;

Ale oczywiście tracimy z puli jeden numer...

VT
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 167
0

alter sequence nie możesz zrobić? http://www.techonthenet.com/oracle/sequences.php
A jak Ci przekręca o jeden numer to możesz do max dodać 1, albo dać w warunku >= ...

DH
  • Rejestracja: dni
  • Ostatnio: dni
0
void-tec napisał(a):

alter sequence nie możesz zrobić? http://www.techonthenet.com/oracle/sequences.php
A jak Ci przekręca o jeden numer to możesz do max dodać 1, albo dać w warunku >= ...

Odnośnie drugiego - nie :) tak nie zadziała, bo przed pętlą wykonuję pobranie kolejnego numeru z sekwencji. Poza tym dodanie do warunku równości spowoduje, że stracę jeszcze jeden numer. Numerek w obecnym kształcie rozwiązania tracę tylko wtedy, gdy max(id)==currval
Ad. 1 - można utworzyć sekwencję w bloku? nie wydaje mi się :)

VT
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 167
0

a bo Ty od razu przekręcasz, currval nie zadziała przed nextvalem, ale piszą, że możesz pobrać wartość z tabeli user_sequences:
select tabela_seq, Last_Number from user_sequences;

A co do pierwszego podejścia -szczerze mówiąc nie robiłem tego ale execute immidiate nie działa?
Tu masz mnóstwo podejść:
http://stackoverflow.com/questions/51470/how-do-i-reset-a-sequence-in-oracle
Generalnie sprowadza się to do ustawienia odpowiednieg increment, przekręcania sekwencji, przestawienia increment z powrotem na 1.
Nie mam oracla w domu, ale nie widzę powodu dla którego nie miało by to działać w boku plsql:

execute immediate 'alter sequence myseq increment by 100';
execute immediate 'select myseq.nextval from dual';
execute immediate 'alter sequence myseq increment by 1';

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.