La distinción entre DML y DDL no es tan clara como implican sus nombres, por lo que a veces las cosas se ponen un poco turbias.
Oracle claramente clasifica TRUNCATE
como DDL en la Guía de conceptos, pero DELETE
como DML.
Los puntos principales que ponen TRUNCATE
en el campamento DDL en Oracle, según tengo entendido, son:
TRUNCATE
puede cambiar los parámetros de almacenamiento (el NEXT
parámetro), y esos son parte de la definición del objeto, eso está en el campamento DDL.
TRUNCATE
hace un implícito commit
y no se puede revertir (flashback aparte): la mayoría (¿todas?) de las operaciones DDL en Oracle hacen esto, no lo hace DML.
El hecho de que TRUNCATE
no ejecute ON DELETE
disparadores también lo distingue de las operaciones normales de DML (pero algunas operaciones directas de DML de ruta directa también omiten los disparadores, por lo que no es un indicador claro).
Esa misma documentación señala que DELETE
genera UNDO, pero TRUNCATE
no lo hace, por lo que su declaración es correcta a este respecto. (Tenga en cuenta que TRUNCATE
genera algo REDO
para que el truncamiento pueda reproducirse en caso de restauración / recuperación). Pero algunas NOLOGGING
operaciones también pueden producir un UNDO reducido (no estoy seguro de nada), por lo que en mi opinión tampoco es un indicador claro.
Entonces lo resumiría como:
truncate
no es "transaccional" en el sentido de que se compromete y no se puede revertir, y puede modificar los atributos de almacenamiento de objetos. Por lo tanto, no es un DML ordinario: Oracle lo clasifica como DDL.
delete
es una declaración DML ordinaria.