Resolvi o problema e posto de volta a solução caso alguém encontre um problema desse tipo.
Se eu não colocar comandos DDL no script, a reversão será executada corretamente.
Então o roteiro:
set autocommit off
whenever SQLERROR EXIT ROLLBACK
insert into a values (1);
insert into a values (2);
insert into a values ('x');
commit;
funciona.
E se o DDL for usado, em geral, o Oracle não fornecerá a funcionalidade de reversão.