Estudiando un poco el tema de transacciones sobre oracle y haciendo algunas pruebas, me he encontrado con algunas cosas de las cuales me gustaría saber la teoría y el funcionamiento interno que hace oracle en estos aspectos.
Código SQL:
Ver original
SQL> CREATE TABLE prueba(num NUMBER); Tabla creada. SQL> INSERT INTO prueba VALUES(1); 1 fila creada. SQL> INSERT INTO prueba VALUES(2); 1 fila creada. SQL> ALTER TABLE prueba ADD num2 NUMBER; Tabla modificada. SQL> ROLLBACK; ROLLBACK terminado. SQL> SELECT *FROM prueba; NUM NUM2 ---------- ---------- 1 2
De esto se deduce, que una sentencia DDL hace un commit implicito de la transacción y la finaliza, ya que al hacer rollback, los registros fueron previamente confirmados por la sentencia DDL.
Mi segunda prueba, fue la que me trajo interrogantes.
Código SQL:
Ver original
SQL> INSERT INTO prueba (num) VALUES(3); 1 fila creada. SQL> SELECT *FROM prueba; NUM NUM2 ---------- ---------- 1 2 3 SQL> ALTER TABLE prueba ADD num3 NUMBERS; ALTER TABLE prueba ADD num3 NUMBERS * ERROR en línea 1: ORA-00902: tipo de dato no válido SQL> ROLLBACK; ROLLBACK terminado. SQL> SELECT *FROM prueba; NUM NUM2 ---------- ---------- 1 2 3
Ejecuto una sentencia DDL con un error (tipo de dato NUMBERS) y efectivamente me muestra el error. Pero al hacer rollback, me doy cuenta que aunque fue una sentencia DDL fallida, me ha ejecutado el commit implicito.

En una tercera prueba hago esto:
Código SQL:
Ver original
SQL> INSERT INTO prueba (num) VALUES(4); 1 fila creada. SQL> SELECT *FROM prueba; NUM NUM2 ---------- ---------- 1 2 3 4 SQL> ALTER TABLE prueba DROP num2; ALTER TABLE prueba DROP num2 * ERROR en línea 1: ORA-00905: falta una palabra clave SQL> ROLLBACK; ROLLBACK terminado. SQL> SELECT *FROM prueba; NUM NUM2 ---------- ---------- 1 2 3
En este caso, aunque mandé una sentencia DDL errornea (Por un error de sintaxis), al hacer ROLLBACK si me deja deshacer los cambios.
En ultimas mi pregunta es:
Cual es la secuencia que realiza ORACLE al ejecutar sentencias DDL dentro de una transacción en curso?
Muchas gracias por su atención