Perbedaan DML versus DDL tidak sejelas yang tersirat dari namanya, sehingga terkadang ada hal-hal yang sedikit berlumpur.
Oracle jelas diklasifikasikan TRUNCATEsebagai DDL dalam Concepts Guide, tetapi DELETEsebagai DML.
Poin utama yang dimasukkan ke TRUNCATEdalam kamp DDL di Oracle, seperti yang saya pahami, adalah:
TRUNCATEdapat mengubah parameter penyimpanan ( NEXTparameter), dan itu adalah bagian dari definisi objek - yang ada di camp DDL.
TRUNCATEmelakukan implisit commit, dan tidak dapat dibatalkan (flashback samping) - sebagian besar (semua?) operasi DDL di Oracle melakukan ini, tidak ada DML yang melakukannya.
Fakta itu TRUNCATEtidak berjalanON DELETE pemicu juga membedakannya dari operasi DML normal (tetapi beberapa operasi jalur langsung DML juga melewatkan pemicu, jadi itu bukan indikator yang jelas).
Dokumentasi yang sama mencatat bahwa DELETEmenghasilkan UNDO, tetapi TRUNCATEtidak, jadi pernyataan Anda benar dalam hal ini. (Catatan yang TRUNCATEmemang menghasilkan beberapa REDOsehingga pemotongan dapat diputar ulang jika terjadi pemulihan / pemulihan.) Tetapi beberapaNOLOGGING operasi juga dapat menghasilkan UNDO berkurang (tidak yakin tentang tidak sama sekali), jadi itu bukan indikator yang jelas baik menurut saya.
Jadi saya akan menjumlahkannya sebagai:
truncatebukan "transaksional" dalam arti bahwa ia melakukan dan tidak dapat dibatalkan, dan dapat memodifikasi atribut penyimpanan objek. Jadi itu bukan DML biasa - Oracle mengklasifikasikannya sebagai DDL.
delete adalah pernyataan DML biasa.