AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 2357
Accepted
DrColossos
DrColossos
Asked: 2011-04-26 00:25:04 +0800 CST2011-04-26 00:25:04 +0800 CST 2011-04-26 00:25:04 +0800 CST

Quais são as diferenças entre "Stored Procedures" e "Stored Functions"?

  • 772

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 SELECTdeclaraçã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 FUNCTIONmas se refere a ele como um PROCEDURE.

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

stored-procedures postgresql
  • 7 7 respostas
  • 60595 Views

7 respostas

  • Voted
  1. Best Answer
    Peter Eisentraut
    2011-04-27T14:17:01+08:002011-04-27T14:17:01+08:00

    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.

    • 63
  2. d4nyll
    2020-03-26T05:12:18+08:002020-03-26T05:12:18+08:00

    O PostgreSQL 11 adicionou procedimentos armazenados como um novo objeto de esquema. Você pode criar um novo procedimento usando a CREATE PROCEDUREinstruçã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 INOUTparâ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 CALLinstrução em vez de uma SELECTinstrução.

    • Ao contrário das funções, os procedimentos não podem ser aninhados em outros comandos DDL ( SELECT, INSERT, UPDATE, DELETE).

    • 45
  3. Jack Douglas
    2011-04-27T01:33:53+08:002011-04-27T01:33:53+08:00

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

    • 18
  4. Jeremiah Peschka
    2011-04-27T12:56:08+08:002011-04-27T12:56:08+08:00

    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 TRIGGERsintaxe é 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".

    • 11
  5. Mike Sherrill 'Cat Recall'
    2011-04-26T03:02:51+08:002011-04-26T03:02:51+08:00

    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.

    • 8
  6. datagod
    2011-04-26T08:05:06+08:002011-04-26T08:05:06+08:00

    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
     - não são normalmente usados ​​dentro de instruções insert/update/delete/select
    
    As funções definidas pelo usuário vêm em vários sabores. Dependendo do tipo de função escrita, as funções:
      - pode ter vários parâmetros de entrada, mas retornar apenas um único valor (ou seja, concatenação de strings)
      - pode aceitar um conjunto como entrada, retornar um único valor (ou seja, dbo.FindLargestPig(ListOfPigs) )
      - retorne uma tabela (ou seja, selecione * de dbo.ExplodeString("esta é uma lista de palavras"))
      - pode ser usado em instruções select/insert/update/delete
      - NÃO PODE ser usado para modificar tabelas/estruturas/dados do banco de dados
    

    • 7
  7. Frank
    2017-11-21T17:31:09+08:002017-11-21T17:31:09+08:00

    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.

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

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

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

    • 3

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve