Строго погледнато, Postgres не има запазени процедури както е дефинирано в стандарта ISO/IEC преди версия 11. Терминът често се използва неправилно за обозначаване на функции , които предоставят голяма част от същата функционалност (и повече), както другите RDBMS предоставят със "запомнени процедури". Основната разлика е обработката на транзакции.
- Какви са разликите между „Съхранени процедури“ и „Съхранени функции“?
Истински запазени процедури най-накрая са представени с Postgres 11:
- Кога да се използва съхранена процедура/функция, дефинирана от потребителя?
Функции са атомни в Postgres и автоматично се изпълняват в собствената им транзакция, освен ако не са извикани в рамките на външна транзакция. Те винаги се изпълняват в рамките на една транзакция и успяват или се провалят напълно . Следователно, човек не може да започва или да извършва транзакции в рамките на функцията. И команди като VACUUM
, CREATE DATABASE
, или CREATE INDEX CONCURRENTLY
които не се изпълняват в контекст на транзакция, не са разрешени.
Ръководството за PL/pgSQL:
Функциите и тригерните процедури винаги се изпълняват в рамките на транзакция, установена от външна заявка — те не могат да стартират или да извършат тази транзакция, тъй като няма да има контекст, в който да се изпълняват. Въпреки това, блок, съдържащ
EXCEPTION
клаузата ефективно формира подтранзакция, която може да бъде отменена, без да се засяга външната транзакция.
Обработка на грешки:
По подразбиране всяка грешка, възникнала във функцията PL/pgSQL, прекратява изпълнението на функцията, както и на околните транзакции. Можете да улавяте грешки и да се възстановявате от тях, като използвате
BEGIN
блок сEXCEPTION
клауза.
Имаизключения , включително, но не само:
- данни, записани в регистрационни файлове
-
промени, направени в последователност
Важно :Някои типове данни и функции на PostgreSQL имат специални правила по отношение на транзакционното поведение. По-специално промените, направени в последователността (и следователно брояча на колона, декларирана с помощта на
serial
) са видими незабавно за всички други транзакции и не се връщат назад, ако транзакцията, която е направила промените, се прекрати. -
подготвени изявления
- Демонстрация на SQL Fiddle
-
dblink повиквания (или подобни)
- Postgres поддържа ли вложени или автономни транзакции?