Il n'y a rien de mal avec la syntaxe de votre déclencheur. Je peux l'exécuter dans mon environnement (vanilla) SQL*Plus :
SQL> CREATE OR REPLACE TRIGGER test_trigger
2 BEFORE INSERT ON test
3 REFERENCING NEW AS NEW FOR EACH ROW
4 BEGIN
5 SELECT test_sequence.nextval INTO :NEW.ID FROM dual;
6 END;
7 /
Trigger created.
SQL>
Et voilà ! le déclencheur fonctionne :
SQL> insert into test (col1) values ('Simples!')
2 /
1 row created.
SQL> select * from test
2 /
ID COL1
---------- ------------
1 Simples!
SQL>
Tout ce que je peux penser, c'est que vous avez des lignes vides dans le code que vous tapez. Si tel est le cas, vous pouvez remplacer le comportement par défaut avec cette commande SQL*Plus :
SQL> set sqlblanklines on