Відмінність DML від DDL не настільки чітка, як випливають з їхніх назв, тому інколи стає дещо каламутним.
Oracle чітко класифікується TRUNCATE
як DDL в Посібнику з концепцій, але DELETE
як DML.
Основні моменти, які ставляться TRUNCATE
в таборі DDL на Oracle, наскільки я розумію, це:
TRUNCATE
можуть змінювати параметри зберігання ( NEXT
параметр), і вони є частиною визначення об'єкта - це в таборі DDL.
TRUNCATE
робить неявне commit
, і його не можна повернути назад (відступ убік) - більшість (усіх?) операцій DDL в Oracle роблять це, жоден DML не робить.
Те, що TRUNCATE
не запускає ON DELETE
тригери, також відрізняє його від звичайних операцій DML (але деякі операції з DML прямого шляху також пропускають тригери, тому це не ясний показник).
Ця ж документація зазначає, що DELETE
створює UNDO, але TRUNCATE
ні, тому ваше твердження є правильним у цьому відношенні. (Зверніть увагу, що TRUNCATE
вони генерують деякі, REDO
щоб усічення можна було відтворити у разі відновлення / відновлення.) Але деякі NOLOGGING
операції також можуть призвести до зменшення UNDO (не впевнений у жодному взагалі), тож це, на мій погляд, не є чітким показником.
Тож я б підсумував це як:
truncate
не є "трансакційним" в тому сенсі, що він здійснює і не може бути відкатований назад, і може змінювати атрибути зберігання об'єктів. Тож це не звичайний DML - Oracle класифікує його як DDL.
delete
- звичайний оператор DML.