Необходимы ли совершение после работы DML в функции/процедуре?

dba.stackexchange https://dba.stackexchange.com/questions/17533

Вопрос

Интересно узнать, необходимо ли написать коммит после вставки/удаления/обновления в функции/процедуре?

Пример:

create or replace function test_fun
return number is
begin
   delete from a;
   return 0;
end;

или процедура

create or replace procedure aud_clear_pro
as
begin
   delete from a;
end;

Нужно ли совершить совершение после удаления?

Не могу понять следующую ситуацию:

  1. Если я вызову функцию/процедуру из окна SQL, это требует коммита

    но

  2. Если я планирую функцию/процедуру с использованием dbms_scheduler и запускаю задание, оператор удаления автоматически совершается.

    ПОЧЕМУ?

Это было полезно?

Решение

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

Если вы позвоните в процедуру интерактивно, вам придется явно совершать или откатить транзакцию, потому что Oracle не имеет представления, если вы намерены, чтобы вызов процедуры была логической транзакцией или намереваетесь составить большую транзакцию, включающую несколько вызовов процедуры. Если вы используете dbms_scheduler, dbms_scheduler Предполагается, что работа - это логическая транзакция, и в конце работы он должен быть успешным (она была успешной (dbms_job делает то же самое).

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

Другие советы

Чтобы ответить на ваш вопрос; ПОЧЕМУ?

Вы, вероятно, уже знаете это к настоящему времени, так как пост 2 года. Но я отвечу только на протокол.

Причина № 1 требует коммита, а № 2 - это то, что настройка базы данных по умолчанию в Oracle заключается в совершении транзакции, когда сеанс заканчивается. Если вы находитесь в SQLPLUS и запускаете свой код вручную, он не сразу совершает транзакцию. Если вы выпустите явный коммит или выходите из SQLPU, то транзакция будет совершена.

Причина, по которой вы получаете автоматический коммит на #2, заключается в том, что он создает сеанс для запуска вашего сценария. Когда он завершает его автоматически выходить из системы, что приведет к автоматическому коммитию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top