Você está fazendo um gatilho "antes de inserir". Nesse gatilho, você não insere na mesma tabela - caso contrário, você pode obter um loop infinito. Basta atribuir ao valor da variável:
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 o gatilho terminar, ele inserirá os valores corretos do
new
variável. Deixe-me apenas dizer que as sequências existem por um motivo, e você deve usá-las para esse propósito. Tentar imitar sua funcionalidade provavelmente levará a erros.