коммит и откат внутри функции postgres - PullRequest
0 голосов
/ 13 ноября 2018

Как я могу реализовать коммит и откат в моей функции postgres, код как ниже.здесь используется откат в исключительном блоке

    CREATE OR REPLACE FUNCTION test () RETURNS VOID AS $body$
DECLARE

test_var smallint;

BEGIN
FOR abc IN
(SELECT DISTINCT ID
    FROM plantab abc
    JOIN xxx_upl_att xxx_val ON zzz_val.idf_tec = abc.ID
)
LOOP
    select * from abc_pk_attribut(abc.ID) into test_var;
    select * from abc_pk_champ(abc.ID) into test_var;
    select * from abc_pk_valeur(abc.ID) into test_var;
    select * from abc_pk_m_att(abc.ID) into test_var;
    PERFORM abc_pk_maj_avalorise(abc.ID);
    PERFORM abc_pk_maj_ab_attr(abc.ID);
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
raise notice 'program_error';
END;

$body$
LANGUAGE PLPGSQL
SECURITY DEFINER
;

1 Ответ

0 голосов
/ 13 ноября 2018

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

Что вы можете:

  1. вы можете вызвать исключение - если это исключение не обработано, то внешний оператор должен выполнить откат.

  2. вы можете использовать пункт EXCEPTION WHEN. Затем защищенный блок неявно объединяется с точкой сохранения. Когда обрабатывается любое исключение, то ядро ​​использует неявно ROLLBACK TO savepoint.

В любом случае, эта система отличается от той, которую вы знаете из MS-SQL или Oracle, и вы не можете использовать некоторые шаблоны, известные вам из Oracle. С другой стороны - дизайн Postgres очень прост.

В новом PostgreSQL 11 есть процедуры, и там вы можете использовать явные COMMIT и ROLLBACK.

...