В общем, процедуры не должны совершать. Эти виды решений по управлению транзакциями следует оставить для кода более высокого уровня, который знает, когда логическая транзакция фактически завершена. Если вы фиксируете внутри хранимой процедуры, вы ограничиваете ее повторное использование, потому что вызывающая сторона, которая хочет, чтобы изменения, вносимые процедурой, были частью более крупной транзакции, не могла просто вызвать процедуру напрямую.
Если вы вызываете процедуру в интерактивном режиме, вам придется явно зафиксировать или откатить транзакцию, потому что Oracle не знает, намерены ли вы вызывать процедуру как логическую транзакцию или если вы намереваетесь составить более крупную транзакцию, включающую несколько вызовов процедур. Если вы используете dbms_scheduler
, dbms_scheduler
предполагается, что задание является логической транзакцией, и фиксирует в конце задания, предполагая, что оно выполнено успешно ( dbms_job
делает то же самое).
Функции не должны манипулировать данными в первую очередь. Функция, которая манипулирует данными, не может быть вызвана из оператора SQL (за исключением случая, когда сама функция объявляет использование автономной транзакции, которая почти никогда не подходит). Весь смысл наличия как функций, так и процедур заключается в том, что функции могут быть встроены в операторы SQL и могут более свободно предоставляться пользователям, поскольку они не изменяют никаких данных.
Ответить на ваш вопрос; ПОЧЕМУ?
Вы, наверное, уже знаете это, поскольку посту уже 2 года. Но я отвечу только для записи.
Причина, по которой № 1 требует фиксации, а № 2 - нет, заключается в том, что настройка базы данных по умолчанию в Oracle заключается в фиксации транзакции по окончании сеанса. Если вы находитесь в sqlplus и запускаете свой код вручную, он не сразу завершит транзакцию. Если вы выполните явную фиксацию или вы выйдете из sqlpus, транзакция будет зафиксирована.
Причина, по которой вы получаете автоматический коммит на # 2, заключается в том, что он создает сеанс для запуска вашего скрипта. Когда он завершается, он автоматически выходит из системы, что приводит к автоматической фиксации.
источник