Quelque chose comme ça fonctionnera sur 11g
CREATE SEQUENCE t1_id_seq
start with 10000
increment by 1;
CREATE TRIGGER trigger_name
BEFORE INSERT ON t1
FOR EACH ROW
DECLARE
BEGIN
IF( :new.id IS NULL )
THEN
:new.id := t1_id_seq.nextval;
END IF;
END;
Si vous êtes sur une version antérieure, vous devrez faire un SELECT INTO pour obtenir la valeur suivante de la séquence
CREATE TRIGGER trigger_name
BEFORE INSERT ON t1
FOR EACH ROW
DECLARE
BEGIN
IF( :new.id IS NULL )
THEN
SELECT t1_id_seq.nextval
INTO :new.id
FROM dual;
END IF;
END;
Sachez que les séquences Oracle ne sont pas sans espace. Il est donc tout à fait possible que des valeurs particulières soient ignorées pour diverses raisons. Votre première insertion peut avoir un ID de 10000 et la seconde peut avoir un ID de 10020 si elle est effectuée quelques minutes, heures ou jours plus tard.
De plus, sachez qu'Oracle ne prend pas en charge la spécification de plusieurs lignes dans la clause VALUES comme le fait MySQL. Alors plutôt que
insert into t1 (firstname, lastname) values ('Michael','Jordan'),('Larry','Bird')
vous auriez besoin de deux instructions INSERT distinctes
insert into t1 (firstname, lastname) values ('Michael','Jordan');
insert into t1 (firstname, lastname) values ('Larry','Bird');