A distinção entre DML e DDL não é tão clara quanto seus nomes sugerem; portanto, as coisas ficam um pouco confusas às vezes.
A Oracle classificaTRUNCATE
claramente como DDL no Guia de Conceitos, mas DELETE
como DML.
Os principais pontos que colocamos TRUNCATE
no campo DDL no Oracle, como eu o entendo, são:
TRUNCATE
pode alterar os parâmetros de armazenamento (o NEXT
parâmetro) e eles fazem parte da definição do objeto - que está no campo DDL.
TRUNCATE
faz um implícito commit
e não pode ser revertido (aparte o flashback) - a maioria (todas?) das operações DDL no Oracle faz isso, nenhum DML faz.
O fato de TRUNCATE
não correrON DELETE
gatilhos também o diferencia das operações DML normais (mas algumas operações DML de caminho direto também ignoram os gatilhos, portanto esse não é um indicador claro).
Essa mesma documentação observa que DELETE
gera UNDO, mas TRUNCATE
não gera , portanto, sua declaração está correta nesse aspecto. (Observe que TRUNCATE
gera alguns REDO
para que o truncamento possa ser repetido em caso de restauração / recuperação.) Mas algunsNOLOGGING
operações também podem produzir UNDO reduzido (não tenho certeza de nenhum), portanto, na minha opinião, esse também não é um indicador claro.
Então, resumiria como:
truncate
não é "transacional" no sentido de confirmar e não pode ser revertido e pode modificar os atributos de armazenamento do objeto. Portanto, não é DML comum - a Oracle classifica como DDL.
delete
é uma instrução DML comum.