2010-08-11 15 views

Répondre

35

Le CLAUSE accepte START WITH un entier. Vous pouvez créer dynamiquement l'instruction "Créer une séquence", puis l'exécuter à l'aide d'exécuter immédiatement pour y parvenir.

declare 
    l_new_seq INTEGER; 
begin 
    select max(id) + 1 
    into l_new_seq 
    from test_table; 

    execute immediate 'Create sequence test_seq_2 
         start with ' || l_new_seq || 
         ' increment by 1'; 
end; 
/

Consultez ces liens.

http://download.oracle.com/docs/cd/B14117_01/server.101/b10759/statements_6014.htm
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/executeimmediate_statement.htm

+2

J'ai eu un petit problème lorsque la table est nouvelle parce que "max (id)" retourne null. J'ai donc dû changer le select à: "select nvl (max (id), 0) + 1" Peut-être que quelqu'un d'autre se heurte au même problème – steven2308

-1

Ici je mon exemple qui fonctionne très bien:

declare 
ex number; 
begin 
    select MAX(MAX_FK_ID) + 1 into ex from TABLE; 
    If ex > 0 then 
    begin 
      execute immediate 'DROP SEQUENCE SQ_NAME'; 
     exception when others then 
     null; 
    end; 
    execute immediate 'CREATE SEQUENCE SQ_NAME INCREMENT BY 1 START WITH ' || ex || ' NOCYCLE CACHE 20 NOORDER'; 
    end if; 
end;