PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL не може да започва/прекратява транзакции в PL/pgSQL

функция plpgsql автоматично се изпълнява в транзакция. Всичко е успешно или всичко се проваля. Ръководството:

Функциите и тригерните процедури винаги се изпълняват в рамките на транзакция, установена от външна заявка — те не могат да стартират или да извършат тази транзакция, тъй като няма да има контекст, в който да се изпълняват. Въпреки това, блок, съдържащ EXCEPTION клауза ефективно формира подтранзакция, която може да бъде върната назад, без да се засяга външната транзакция. За повече информация вижте раздел 42.6.6.

Така че, ако трябва, можете да хванете изключение, което теоретично може да възникне (но е много малко вероятно).
Подробности за прихващането на грешки в ръководството.

Вашата функция е прегледана и опростена:

CREATE FUNCTION foo(v_weather text
                  , v_timeofday text
                  , v_speed text
                  , v_behavior text)
  RETURNS SETOF custombehavior
  LANGUAGE plpgsql AS
$func$
BEGIN

DELETE FROM custombehavior
WHERE  weather = 'RAIN'
AND    timeofday = 'NIGHT'
AND    speed = '45MPH';

INSERT INTO custombehavior (weather, timeofday, speed, behavior)
SELECT v_weather, v_timeofday, v_speed, v_behavior
WHERE  NOT EXISTS (
   SELECT FROM defaultbehavior
   WHERE  a = 'RAIN'
   AND    b = 'NIGHT'
   AND    c = '45MPH'
   );

RETURN QUERY
SELECT * FROM custombehavior WHERE ... ;

END
$func$;

Ако наистина трябва да започвате/прекратявате транзакции както е посочено в заглавието, погледнете SQL процедурите в Postgres 11 или по-нова версия (CREATE PROCEDURE ). Вижте:

  • В PostgreSQL каква е разликата между „запомнена процедура“ и други типове функции?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Защо итерацията през голям Django QuerySet консумира огромни количества памет?

  2. Как Acosh() работи в PostgreSQL

  3. Postgres се проваля с „не може да се отвори файлът за съпоставяне на релации global/pg_filenode.map“

  4. Каква е разликата между `->>` и `->` в Postgres SQL?

  5. Вземете броя на дните в месеца в PostgreSQL