Estritamente falando, o Postgres não tem procedimentos armazenados conforme definido no padrão ISO/IEC antes da versão 11. O termo geralmente é usado incorretamente para se referir a funções , que fornecem muitas das mesmas funcionalidades (e mais) que outros RDBMS fornecem com "procedimentos armazenados". A principal diferença é a manipulação de transações.
- Quais são as diferenças entre "Procedimentos armazenados" e "Funções armazenadas"?
Verdadeiros procedimentos armazenados são finalmente introduzidos com o Postgres 11:
- Quando usar o procedimento armazenado/função definida pelo usuário?
Funções são atômicos no Postgres e executados automaticamente dentro de sua própria transação, a menos que sejam chamados em uma transação externa. Eles sempre são executados em uma única transação e têm sucesso ou falham completamente . Conseqüentemente, não é possível iniciar ou confirmar transações dentro da função. E comandos como
VACUUM
, CREATE DATABASE
, ou CREATE INDEX CONCURRENTLY
que não são executados em um contexto de transação não são permitidos. O manual sobre PL/pgSQL:
Funções e procedimentos de gatilho são sempre executados dentro de uma transação estabelecida por uma consulta externa — eles não podem iniciar ou confirmar essa transação, pois não haveria contexto para eles serem executados. No entanto, um bloco contendo umaEXCEPTION
cláusula forma efetivamente uma subtransação que pode ser revertida sem afetar a transação externa.
Manipulação de erros:
Por padrão, qualquer erro que ocorra em uma função PL/pgSQL aborta a execução da função e também da transação circundante. Você pode interceptar erros e recuperá-los usando umBEGIN
bloco com umaEXCEPTION
cláusula.
Existem exceções , incluindo mas não limitado a:
- dados gravados em arquivos de log
-
alterações feitas em uma sequência
Importante :Alguns tipos de dados e funções do PostgreSQL possuem regras especiais em relação ao comportamento transacional. Em particular, as alterações feitas em uma sequência (e, portanto, no contador de uma coluna declarada usandoserial
) são imediatamente visíveis para todas as outras transações e não são revertidas se a transação que fez as alterações for abortada.
-
declarações preparadas
- Demonstração do SQL Fiddle
-
chamadas dblink (ou similar)
- O Postgres oferece suporte a transações aninhadas ou autônomas?