Stai eseguendo un trigger "prima dell'inserimento". In un tale trigger, non si inserisce nella stessa tabella, altrimenti è possibile ottenere un ciclo infinito. Basta assegnare al valore della variabile:
CREATE OR REPLACE TRIGGER trig_deptno2
BEFORE INSERT ON dept2
FOR EACH ROW
DECLARE v_deptno NUMBER(2) ;
BEGIN
SELECT coalesce(MAX(deptno) + 1, 1) INTO :new.deptno
FROM dept2 ;
END trig_deptno2 ;
Quando il trigger è terminato, inserirà i valori corretti dal new
variabile.
Lasciatemi dire solo che le sequenze esistono per una ragione e dovreste usarle per questo scopo. È probabile che il tentativo di imitare la loro funzionalità porti a errori.