В общем, процедуры не должны совершать. Эти виды решений по управлению транзакциями следует оставить для кода более высокого уровня, который знает, когда логическая транзакция фактически завершена. Если вы фиксируете внутри хранимой процедуры, вы ограничиваете ее повторное использование, потому что вызывающая сторона, которая хочет, чтобы изменения, вносимые процедурой, были частью более крупной транзакции, не могла просто вызвать процедуру напрямую.
Если вы вызываете процедуру в интерактивном режиме, вам придется явно зафиксировать или откатить транзакцию, потому что Oracle не знает, намерены ли вы вызывать процедуру как логическую транзакцию или если вы намереваетесь составить более крупную транзакцию, включающую несколько вызовов процедур. Если вы используете dbms_scheduler
, dbms_scheduler
предполагается, что задание является логической транзакцией, и фиксирует в конце задания, предполагая, что оно выполнено успешно ( dbms_job
делает то же самое).
Функции не должны манипулировать данными в первую очередь. Функция, которая манипулирует данными, не может быть вызвана из оператора SQL (за исключением случая, когда сама функция объявляет использование автономной транзакции, которая почти никогда не подходит). Весь смысл наличия как функций, так и процедур заключается в том, что функции могут быть встроены в операторы SQL и могут более свободно предоставляться пользователям, поскольку они не изменяют никаких данных.