2014-11-12 5 views
1

PostgreSQL не имеет возможности вставлять точки сохранения в триггерные функции, а при возникновении исключения (например, исключение NO_DATA_FOUND) вся транзакция откатывается назад. Но вместо того, чтобы откатить всю транзакцию, я просто хотел вернуться к последней сохраненной точке.Сделки - Oracle Vs PostgreSQL

Есть ли другой альтернативный способ, в котором я могу иметь несколько точек сохранения внутри триггерных функций в Postgresql.

Вот мой код:

CREATE OR REPLACE FUNCTION func_ex() RETURNS trigger AS $func_ex$ 
    DECLARE    
    var_name name; 

    BEGIN 
     INSERT INTO log_table (empid, empname) values (100, 'Name'); 

     -- savepoint my_savepoint; "cannot have savepoints in triggers 

     Select empname INTO strict var_name from emp_table1 WHERE empid = 3232332; 

    EXCEPTION WHEN NO_DATA_FOUND THEN 
    RAISE Notice 'No data found'; 
    RETURN NEW; 

    END; 

    return new 
$func_ex$ LANGUAGE plpgsql; 
-- End of Function 

-- Creation of Trigger 
    CREATE TRIGGER insert_trigger1 AFTER update of empname 
    ON emp_table1 EXECUTE PROCEDURE func_ex(); 

ответ

1

PostgreSQL не имеют функции для вставки точек сохранения в функции запуска

На самом деле, это делает, они просто неявный в BEGIN ... EXCEPTION блоков ,

Ваш код выглядит правильно, и неясно, чего вы пытаетесь достичь, чего он еще не делает.

Если вы хотите несколько точек сохранения в триггерах, гнездо BEGIN ... EXCEPTION блоков. Вы можете использовать RAISE с пользовательским SQLSTATE для управления потоком.

Было бы неплохо, если PL/PgSQL также поддерживал явные именованные точки сохранения, но использование блоков исключений хорошо работает в моем опыте.

+0

Я хочу предотвратить неявный откат всей транзакции, когда в триггерных функциях произошло исключение. – user1581721

+1

@ user1581721, но вы уже показываете, как это сделать в своем вопросе, поэтому я не понимаю, что вы просите. –

+0

Имея Nested Begin .. Исключительные блоки Я мог бы иметь несколько точек сохранения в триггерных функциях. – user1581721

0

Имея Вложенные Begin .. Исключительные блоки Я мог бы иметь несколько точек сохранения в функциях триггера.