Oracle Forms — фиксируйте один оператор SQL вместо всей формы

Я работаю над формой 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; затем вся форма проходит проверку и обновляет все измененные строки.

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


person Jarrod Nettles    schedule 24.06.2011    source источник


Ответы (1)


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

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;    

Тогда ваш код Forms может выглядеть так:

begin
    if :query_block.profile_code is not null then
      stat := my_fnc(:query_block.CHECKBOX_FLAG);
    end if;
end;

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

person DCookie    schedule 24.06.2011