Создание процедур с транзакциями с использованием PGAdmin 4 - PullRequest
0 голосов
/ 20 сентября 2019

Я пришел из долгой истории с SQL Server и пытаюсь изучить PL / PGSQL.Недавно я обнаружил функцию PG11 CREATE PROCEDURE, которая позволяет выполнять внутренние транзакции внутри их тела.

В качестве учебного упражнения я создал следующее:

DROP PROCEDURE IF EXISTS test_proc();
CREATE PROCEDURE test_proc()
       LANGUAGE plpgsql
AS $$
  BEGIN
    DROP TABLE IF EXISTS a;
    CREATE TABLE a (aid int);
    COMMIT;
  END;
$$;

call test_proc();

Он отлично работает в PSQL, однако, когда я выполняю его в инструменте запросов PGAdmin 4, он выдает ошибку

ОШИБКА: недопустимое завершение транзакции

КОНТЕКСТ: функция PL / pgSQL test_proc () строка 5 в COMMIT

Состояние SQL: 2D000

Может кто-тообъясните пожалуйста что происходит?Я предполагаю, что ПРОЦЕДУРА действительно действительна, и проблема может заключаться в том, что в инструменте запросов неправильно обрабатывается содержащийся COMMIT.

Есть ли какие-либо предложения для решения этой проблемы?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Можете ли вы попробовать снять флажок с параметрами автоматической фиксации и автоматического отката в pgAdmin4?

Вы можете найти раскрывающийся список рядом с кнопкой «Выполнить» в инструменте запросов.

enter image description here

0 голосов
/ 20 сентября 2019

В Pgadmin CREATE PROCEDURE как FUNCTION попробуйте это, замените PROCEDURE на Function и добавьте также тип возврата, и он будет работать

DROP FUNCTION  IF EXISTS test_proc();
CREATE FUNCTION  test_proc()
RETURNS VOID 
LANGUAGE plpgsql

AS $$
  BEGIN
    DROP TABLE IF EXISTS a;
    CREATE TABLE a (aid int);
    COMMIT;
  END;
$$;
...