Se puede hacer un rollback o un roll en una transacción. Se puede hacer un rollback hasta un savepoint, pero no es posible hacer un roll hasta un savepoint:
SQL> alter session set nls_language = 'SPANISH'; Sesion modificada. SQL>
Creamos una tabla y ponemos datos dentro:
SQL> create table names
2 (first_name varchar2(10));
Tabla creada.
SQL> insert into names values ('Andrew');
1 fila creada.
SQL>
Luego hacemos un roll y los datos desaparecen:
SQL> roll; Rollback terminado. SQL> select * from names; ninguna fila seleccionada SQL>
Ahora hacemos la misma cosa pero esta vez el roll es seguido por la palabra blah que es una etiqueta:
SQL> insert into names values ('Brian');
1 fila creada.
SQL> roll blah;
Rollback terminado.
SQL> select * from names;
ninguna fila seleccionada
SQL>
Ponemos el nombre Colin en la tabla y creamos un savepoint:
SQL> insert into names values ('Colin');
1 fila creada.
SQL> savepoint colin;
Punto de grabacion creado.
SQL>
Y lo hacemos otra vez con David:
SQL> update names set first_name = 'David'; 1 fila actualizada. SQL> savepoint david; Punto de grabacion creado. SQL> update names set first_name = 'Edward'; 1 fila actualizada. SQL>
Ahora hacemos un rollback hasta el savepoint david. Éste funciona, el nombre Edward desaparece y el nombre David reaparece:
SQL> rollback to savepoint david; Rollback terminado. SQL> select first_name from names; FIRST_NAME ---------- David SQL>
Por fin, intentamos hacer un roll hasta el savepoint colin. Éste no funciona. Oracle piensa que to savepoint colin sea una etiqueta y hace un roll de la transacción entera :
SQL> roll to savepoint colin; Rollback terminado. SQL> select first_name from names; ninguna fila seleccionada SQL>