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ę :)
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ę :)
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...
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 >= ...
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ę :)
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';