Oracle Forms - зафиксируйте один оператор SQL вместо всей формы - PullRequest
2 голосов
/ 24 июня 2011

Я работаю над формой Oracle (10g), которая имеет два блока на одном холсте.Верхний блок называется QUERY_BLOCK, который пользователь заполняет, чтобы заполнить PRICING_BLOCK строками данных.

Однако в QUERY_BLOCK у меня также есть флажок, который должен выполнять INSERT и DELETE для базы данных соответственно.Мой триггер WHEN-CHECKBOX-CHANGED выглядит следующим образом:

begin
    if :query_block.profile_code is not null then

        if :query_block.CHECKBOX_FLAG = 'Y' then
            begin
                INSERT INTO profile_table VALUES ('Y', :query_block.profile_code);
            end;
        else
            begin
                DELETE FROM profile_table WHERE profile_code = :query_block.profile_code and profile_type_code = 'FR';
            end;
        end if;
    end if;
end;

Я знаю, что мне нужно добавить какое-нибудь утверждение коммита здесь, в противном случае запись блокируется и на самом деле ничего не происходит.Однако, если я сделаю COMMIT;затем вся форма проходит проверку и обновляет все измененные строки.

Как выполнить эти однострочные запросы, которые у меня есть, без обновления всей остальной части моей формы?

1 Ответ

2 голосов
/ 24 июня 2011

Не комментируя фактическую целесообразность этого, вы можете создать процедуру в базе данных, которая выполнила автономную транзакцию :

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;

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

...