Запуск триггера после спящего вставки, возвращающего ошибку [дубликат]

перераспределить / скомпилировать до 1 раздела перед сохранением (вы все равно получите папку, но в ней будет один файл детали)

2
задан Erwin Brandstetter 22 May 2013 в 23:35
поделиться

1 ответ

Оба ответа до сих пор неверны. Если вы попытаетесь запустить транзакцию или использовать SAVEPOINT внутри функции plpgsql, вы получите сообщение об ошибке следующим образом:

ERROR:  cannot begin/end transactions in PL/pgSQL
HINT:  Use a BEGIN block with an EXCEPTION clause instead.
CONTEXT:  PL/pgSQL function "f_savepoint" line 6 at SQL statement

Если вы попробуете SAVEPOINT внутри простая функция SQL:

ERROR:  SAVEPOINT is not allowed in a SQL function
CONTEXT:  SQL function "f_savepoint2" during startup

Как указано в сообщении об ошибке, используйте блок BEGIN внутри функции plpgsql. Ваша демонстрация может выглядеть так:

CREATE OR REPLACE FUNCTION transact_test(boolean)
  RETURNS boolean AS
$func$
BEGIN -- start a nested BEGIN block
    UPDATE t SET i = i+1 WHERE i = 1;
    UPDATE t SET i = i+1 WHERE i = 3;
    IF $1 THEN
        RAISE EXCEPTION 'foo';  -- cancels all of the above
    END IF;

    RETURN TRUE;

EXCEPTION WHEN OTHERS THEN
    RETURN FALSE; 
    -- do nothing
END
$func$ LANGUAGE plpgsql;

-> SQLfiddle , демонстрируя все это.

3
ответ дан Erwin Brandstetter 22 August 2018 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: