Oficialmente, o PostgreSQL possui apenas "funções". Às vezes, as funções de gatilho são chamadas de "procedimentos de gatilho", mas esse uso não tem significado distinto. Internamente, as funções às vezes são chamadas de procedimentos, como no catálogo do sistema pg_proc
. Isso é uma remanescente do PostQUEL. Quaisquer recursos que algumas pessoas (possivelmente com experiência em diferentes sistemas de banco de dados) possam associar a procedimentos, como sua relevância para impedir injeções de SQL ou o uso de parâmetros de saída, também se aplicam às funções como existem no PostgreSQL.
Agora, quando as pessoas da comunidade PostgreSQL falam sobre "procedimentos armazenados" ou "procedimentos armazenados reais", no entanto, geralmente significam um recurso hipotético de um objeto semelhante a uma função que pode iniciar e interromper transações em seu corpo, algo que as funções atuais não podem Faz. O uso do termo "procedimento armazenado" neste contexto parece ser por analogia com outros produtos de banco de dados. Veja esta lista de discussão para uma vaga idéia.
Na prática, no entanto, essa distinção de função versus procedimento em termos de suas capacidades de controle de transações não é universalmente aceita, e certamente muitos programadores sem viés de banco de dados terão uma interpretação semelhante a Pascal de um procedimento como uma função sem valor de retorno. (O padrão SQL parece ter um meio termo, pois um procedimento por padrão tem um comportamento de transação diferente de uma função, mas isso pode ser ajustado por objeto.) Portanto, em qualquer caso, e especialmente ao examinar as perguntas no Stack Exchange com Para um público muito misto, evite assumir demais e use termos mais claros ou defina as propriedades que espera.
Comparando a resposta aceita do nível conceitual abstrato, eu entendo a diferença da funcionalidade e da perspectiva de entrada / saída. Abaixo, usei spef para representar procedimento e função armazenados, respectivamente.
Use em uma expressão: sp não pode ser usado em uma expressão enquanto function can, o que significa que você pode usar seu valor retornado de af dentro de outras instruções, como
retornar um valor: sp não retorna automaticamente um valor, a menos que você especifique o tipo de retorno refcursor , abra e retorne um cursor; f retorna o resultado na última instrução em que uma cláusula 'return' é incorporada, como uma cláusula select .
retornar conjuntos de resultados únicos / múltiplos: aqui, conjuntos de resultados referem uma lista de resultados que podem diferir em formato, como conjunto de número inteiro único, matriz de texto e duas tabelas. sp pode retornar vários conjuntos, desde que você especifique o tipo de retorno do refcursor, abra e retorne um cursor. No entanto, f pode retornar apenas um tipo de conjunto.
Geralmente, os procedimentos armazenados são usados para modificar os dados ou a estrutura do banco de dados onde o valor de retorno não é necessário, como excluir, atualizar, descartar , etc; ou situações em que vários conjuntos de resultados são necessários. A função, por outro lado, é escolhida principalmente para consultas simples.
Para mais detalhes sobre a minha explicação, consulte este link: Procedimentos armazenados e funções no PostgreSQL
fonte