Не комментируя фактическую целесообразность этого, вы можете создать процедуру в базе данных, которая выполнила автономную транзакцию :
CREATE OR REPLACE FUNCTION my_fnc(p_flag IN VARCHAR2)
RETURN VARCHAR2 IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
IF p_flag = 'Y' THEN
INSERT...
ELSE
DELETE...
END IF;
COMMIT;
RETURN 'SUCCESS';
EXCPTION
WHEN OTHERS THEN
RETURN 'FAIL';
END;
Ваш код форм может выглядеть следующим образом:
begin
if :query_block.profile_code is not null then
stat := my_fnc(:query_block.CHECKBOX_FLAG);
end if;
end;
Это позволяет вашей функции совершать транзакции независимо от вызывающей транзакции.Однако остерегайтесь этого - если ваша внешняя транзакция должна откатиться, автономная транзакция все равно будет зафиксирована.Я думаю, что должен быть транзакционный способ сделать то, что вам нужно, чтобы решить проблему блокировки, что, вероятно, будет лучшим подходом.Не зная специфики вашего процесса, я не могу сказать.Вообще говоря, автономные транзакции используются, когда обновление должно происходить независимо от того, фиксируется ли транзакция или откатывается, например, ведение журнала.