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 TRUNCATEcomo DDL en la Guía de conceptos, pero DELETEcomo DML.
Los puntos principales que ponen TRUNCATEen el campamento DDL en Oracle, según tengo entendido, son:
TRUNCATEpuede cambiar los parámetros de almacenamiento (el NEXTparámetro), y esos son parte de la definición del objeto, eso está en el campamento DDL.
TRUNCATEhace un implícito commity 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 TRUNCATEno ejecute ON DELETEdisparadores 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 DELETEgenera UNDO, pero TRUNCATEno lo hace, por lo que su declaración es correcta a este respecto. (Tenga en cuenta que TRUNCATEgenera algo REDOpara que el truncamiento pueda reproducirse en caso de restauración / recuperación). Pero algunas NOLOGGINGoperaciones 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:
truncateno 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.