Portanto, um comentário desta pergunta menciona que há uma pequena diferença em "Procedimentos armazenados" e "Funções armazenadas" no PostgreSQL.
O comentário tem links para um artigo da wikipedia, mas alguns deles não parecem se aplicar (por exemplo, que podem ser usados em uma SELECT
declaração).
A sintaxe em si parece ser um pouco confusa:
CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
BEGIN
[...]
END;
$emp_stamp$ LANGUAGE plpgsql;
CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
FOR EACH ROW EXECUTE PROCEDURE emp_stamp();
Você cria um FUNCTION
mas se refere a ele como um PROCEDURE
.
Então, qual é a diferença entre esses dois?
Oficialmente, o PostgreSQL só tem "funções". As funções de gatilho às vezes 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 é um resquício 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 evitar injeções de SQL ou o uso de parâmetros de saída, também se aplicam a funções como existem no PostgreSQL.Agora, quando as pessoas na comunidade PostgreSQL falam sobre "procedimentos armazenados" ou "procedimentos armazenados reais", no entanto, eles geralmente se referem a 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 este tópico da lista de discussão para uma ideia vaga.
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.) Então, em qualquer caso, e especialmente ao analisar perguntas no Stack Exchange com um público muito variado, você deve evitar assumir muito e usar termos mais claros ou definir as propriedades que você espera.
O PostgreSQL 11 adicionou procedimentos armazenados como um novo objeto de esquema. Você pode criar um novo procedimento usando a
CREATE PROCEDURE
instrução.Os procedimentos armazenados diferem das funções das seguintes maneiras:
Os procedimentos armazenados não precisam retornar nada e retornam apenas uma única linha ao usar
INOUT
parâmetros.Você pode confirmar e reverter transações dentro de procedimentos armazenados, mas não em funções.
Você executa um procedimento armazenado usando a
CALL
instrução em vez de umaSELECT
instrução.Ao contrário das funções, os procedimentos não podem ser aninhados em outros comandos DDL (
SELECT
,INSERT
,UPDATE
,DELETE
).Em termos de DDL, o Postgres não possui objetos de procedimento, apenas funções. As funções do Postgres podem retornar valor(es) ou void para que assumam os papéis de funções e procedimentos em outros RDBMSs. A palavra 'procedimento' no
create trigger
refere-se a uma função.Em termos da documentação do Postgres, 'procedure' também é um sinônimo para o objeto de banco de dados chamado de função, por exemplo: " Um procedimento de gatilho é criado com o comando CREATE FUNCTION ".
Os 'procedimentos' de gatilho têm regras particulares: eles devem ser declarados como uma função sem argumentos e um tipo de retorno de gatilho . Exemplo aqui .
Os termos "procedimento armazenado" e "função armazenada" são usados alternadamente no PostgreSQL e geralmente têm o mesmo significado. Outros bancos de dados podem diferenciar entre um procedimento e uma função (assim como o VB diferencia entre sub-rotinas e funções).
Desde que uma função no PostgreSQL retorne algo parecido com uma tabela, você pode usar a saída dessa função como se fosse uma tabela padrão. A
CREATE TRIGGER
sintaxe é um pouco confusa, mas suspeito que ela já existia antes da finalização do padrão ANSI. Eu só tenho uma cópia do SQL:2003, então não posso fazer muito mais do que especular por que a nomenclatura é estranha.Versão TL;DR: com PostgreSQL "procedimento" é equivalente a "função".
A resposta curta é que uma função retorna um valor, mas um procedimento não.
Essa distinção estava presente no Persistent Stored Modules (SQL/PSM), que foi proposto para o SQL 1992. Não sei se o SQL/PSM chegou aos padrões.
No MSSQL, um procedimento armazenado é um conjunto pré-compilado de comandos sql.
As funções definidas pelo usuário vêm em vários sabores. Dependendo do tipo de função escrita, as funções:Um procedimento armazenado:
Comparando a resposta aceita do nível conceitual abstrato, entendo a diferença da funcionalidade e da perspectiva de entrada/saída. Abaixo, usei sp e f para representar o procedimento armazenado e a função, respectivamente.
Use em uma expressão: sp não pode ser usado em uma expressão enquanto a função pode, o que significa que você pode usar seu valor retornado de af dentro de outras instruções, como
retorna um valor: sp não retorna um valor automaticamente, a menos que você especifique o tipo de retorno do refcursor , abra e retorne um cursor; f retorna o resultado na última instrução onde uma cláusula 'return' está incorporada, como uma cláusula select .
retornar conjuntos de resultados únicos/múltiplos: aqui os conjuntos de resultados referem-se a uma lista de resultados que podem diferir em formato, como conjunto de inteiro único, matriz de texto e duas tabelas. sp pode retornar vários conjuntos, desde que você especifique o tipo de retorno refcursor, abra e retorne um cursor. No entanto, f só pode retornar um tipo de conjunto.
Normalmente, 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 delete, update, drop , 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 minha explicação, consulte este link: Stored Procedures and Functions in PostgreSQL