Ich habe das Problem gelöst und poste die Lösung zurück, falls jemand auf ein solches Problem stößt.
Wenn ich keine DDL-Befehle in das Skript einfüge, wird das Rollback korrekt ausgeführt.
Also das Skript:
set autocommit off
whenever SQLERROR EXIT ROLLBACK
insert into a values (1);
insert into a values (2);
insert into a values ('x');
commit;
funktioniert.
Und wenn DDL verwendet wird, bietet Oracle im Allgemeinen keine Rollback-Funktionalität.