Quais são as diferenças entre "Procedimentos armazenados" e "Funções armazenadas"?

36

Portanto, um comentário desta pergunta menciona que há uma pequena diferença em "Stored Procedurerues" e "Stored Funtions" no PostgreSQL.

O comentário está vinculado a um artigo da Wikipedia, mas parte disso parece não se aplicar (por exemplo, que eles podem ser usados ​​em uma SELECTdeclaração).

A sintaxe em si parece 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 FUNCTIONmas se refere a ele como um PROCEDURE.

Então, qual é a diferença entre esses dois?

DrColossos
fonte

Respostas:

43

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.

Peter Eisentraut
fonte
14

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 invalidar, para que assumam as funções de funções e procedimentos em outros RDBMSs. A palavra 'procedimento' no create triggerrefere-se a uma função.

Nos termos da documentação do Postgres, 'procedure' também é sinônimo de objeto de banco de dados chamado função, por exemplo: " Um procedimento de trigger é criado com o comando CREATE FUNCTION ".

Os 'procedimentos' do gatilho têm regras específicas: eles devem ser declarados como uma função sem argumentos e um tipo de retorno de gatilho . Exemplo aqui .

Jack Douglas
fonte
8

Os termos "procedimento armazenado" e "função armazenada" são usados ​​de forma intercambiável no PostgreSQL e geralmente são considerados a mesma coisa. Outros bancos de dados podem diferenciar entre um procedimento e uma função (como o VB diferencia entre sub-rotinas e funções).

Contanto que uma função no PostgreSQL retorne algo que se assemelhe a uma tabela, você pode usar a saída dessa função como se fosse uma tabela padrão. A CREATE TRIGGERsintaxe é um pouco confusa, mas suspeito que ela já estivesse em vigor 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: no PostgreSQL, "procedure" é equivalente a "function".

Jeremiah Peschka
fonte
6

No MSSQL, um procedimento armazenado é um conjunto pré-compilado de comandos sql.
Um procedimento armazenado:

 - pode ter muitos parâmetros de entrada e saída
 - pode ser usado para modificar tabelas / estruturas / dados do banco de dados
 - normalmente não são usados ​​nas instruções insert / update / delete / select
As funções definidas pelo usuário são fornecidas em vários tipos. Dependendo do tipo de função escrita, as funções:
  - pode ter vários parâmetros de entrada, mas retorna apenas um valor único (por exemplo, concatenação de strings)
  - pode aceitar um conjunto como entrada, retornar um único valor (por exemplo, dbo.FindLargestPig (ListOfPigs))
  - retorna uma tabela (ou seja, selecione * em dbo.ExplodeString ("esta é uma lista de palavras"))
  - pode ser usado em instruções de seleção / inserção / atualização / exclusão
  - NÃO PODE ser usado para modificar tabelas / estruturas / dados do banco de dados

datagod
fonte
5

A resposta curta é que uma função retorna um valor, mas um procedimento não.

Essa distinção estava presente nos Módulos Persistentes Armazenados (SQL / PSM), propostos para o SQL 1992. Não sei se o SQL / PSM chegou aos padrões.

Mike Sherrill 'Recorde Gato'
fonte
Eu acho que é o seguinte
xenoterracide
Isso soa notavelmente como a sintaxe do VB. A função retorna um valor e um procedimento não (por isso, se você tinha um valor de retorno em uma função que iria explodir sobre o compilador)
jcolebrand
@jcolebrand Na verdade, os nomes são mais aparentes em Pascal. Um procedimento não retorna um resultado, enquanto uma função retorna . Por razões históricas, o VBA usa o idioma do FORTRAN, que os chama (chamado?) De SUBRUTINA E FUNÇÃO . As linguagens modernas do tipo C apenas têm funções, mas as linguagens digitadas têm a opção de funções nulas, que são procedimentos com outro nome. Uma tendência popular é usar apenas funções normais para tudo e retornar algo que pode ser ignorado, se você quiser.
Manngo 17/02
2

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.

  1. 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

    select * 
    from table 
    where col_a < (select col_A from f())
  2. 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 .

  3. 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

Frank
fonte