Qualcosa del genere funzionerà su 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;
Se utilizzi una versione precedente, dovrai eseguire SELECT INTO per ottenere il valore successivo dalla sequenza
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;
Tieni presente che le sequenze Oracle non sono prive di interruzioni. Quindi è del tutto possibile che valori particolari vengano saltati per una serie di motivi. Il tuo primo inserto potrebbe avere un ID di 10000 e il secondo potrebbe avere un ID di 10020 se viene eseguito minuti, ore o giorni dopo.
Inoltre, tieni presente che Oracle non supporta la specifica di più righe nella clausola VALUES come fa MySQL. Quindi, piuttosto che
insert into t1 (firstname, lastname) values ('Michael','Jordan'),('Larry','Bird')
avresti bisogno di due istruzioni INSERT separate
insert into t1 (firstname, lastname) values ('Michael','Jordan');
insert into t1 (firstname, lastname) values ('Larry','Bird');