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

0

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

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ę :)

0

Rozwiązanie na jakie wpadłem:

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...

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 >= ...

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ę :)

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1