Ho risolto il problema e inserisco la soluzione nel caso in cui qualcuno riscontrasse un problema del genere.
Se non inserisco i comandi DDL nello script, il rollback viene eseguito correttamente.
Quindi lo script:
set autocommit off
whenever SQLERROR EXIT ROLLBACK
insert into a values (1);
insert into a values (2);
insert into a values ('x');
commit;
lavori.
E se viene utilizzato DDL, in generale Oracle non fornisce funzionalità di rollback.