A diferença mais geral entre procedimentos e funções é que eles são invocados de maneira diferente e para propósitos diferentes:
- Um procedimento não retorna um valor. Em vez disso, ele é invocado com uma instrução CALL para realizar uma operação, como modificar uma tabela ou processar registros recuperados.
- Uma função é invocada em uma expressão e retorna um único valor diretamente ao chamador para ser usado na expressão.
- Você não pode invocar uma função com uma instrução CALL, nem pode invocar um procedimento em uma expressão.
A sintaxe para criação de rotinas difere um pouco para procedimentos e funções:
- Os parâmetros do procedimento podem ser definidos como somente entrada, somente saída ou ambos. Isso significa que um procedimento pode passar valores de volta para o chamador usando parâmetros de saída. Esses valores podem ser acessados em instruções que seguem a instrução CALL. As funções têm apenas parâmetros de entrada. Como resultado, embora procedimentos e funções possam ter parâmetros, a declaração de parâmetro de procedimento difere daquela para funções.
-
As funções retornam o valor, portanto, deve haver uma cláusula RETURNS em uma definição de função para indicar o tipo de dados do valor de retorno. Além disso, deve haver pelo menos uma instrução RETURN no corpo da função para retornar um valor ao chamador. RETURNS e RETURN não aparecem nas definições de procedimento.
-
Para invocar um procedimento armazenado, use aCALL statement
. Para invocar uma função armazenada, faça referência a ela em uma expressão. A função retorna um valor durante a avaliação da expressão.
-
Um procedimento é invocado usando uma instrução CALL e só pode retornar valores usando variáveis de saída. Uma função pode ser chamada de dentro de uma instrução como qualquer outra função (ou seja, invocando o nome da função) e pode retornar um valor escalar.
-
Especificar um parâmetro como IN, OUT ou INOUT é válido apenas para um PROCEDURE. Para uma FUNCTION, os parâmetros são sempre considerados como parâmetros IN.
Se nenhuma palavra-chave for fornecida antes de um nome de parâmetro, é um parâmetro IN por padrão.Os parâmetros para funções armazenadas não são precedidos por IN, OUT ou INOUT. Todos os parâmetros de função são tratados como parâmetros IN.
-
Para definir um procedimento armazenado ou função, use CREATE PROCEDURE ou CREATE FUNCTION respectivamente:
CREATE PROCEDURE proc_name ([parameters])
[characteristics]
routine_body
CREATE FUNCTION func_name ([parameters])
RETURNS data_type // diffrent
[characteristics]
routine_body
Uma extensão do MySQL para procedimento armazenado (não funções) é que um procedimento pode gerar um conjunto de resultados, ou mesmo vários conjuntos de resultados, que o chamador processa da mesma maneira que o resultado de uma instrução SELECT. No entanto, o conteúdo de tais conjuntos de resultados não pode ser usado diretamente na expressão.
Rotinas armazenadas (referindo-se a procedimentos armazenados e funções armazenadas) estão associados a um banco de dados específico, assim como tabelas ou visualizações. Quando você descarta um banco de dados, todas as rotinas armazenadas no banco de dados também são eliminadas.
Os procedimentos e funções armazenados não compartilham o mesmo namespace. É possível ter um procedimento e uma função com o mesmo nome em um banco de dados.
Em procedimentos armazenados, SQL dinâmico pode ser usado, mas não em funções ou gatilhos.
As instruções preparadas SQL (PREPARE, EXECUTE, DEALLOCATE PREPARE) podem ser usadas em procedimentos armazenados, mas não em funções ou gatilhos armazenados. Assim, funções armazenadas e gatilhos não podem usar SQL dinâmico (onde você constrói instruções como strings e depois as executa). (SQL dinâmico em rotinas armazenadas do MySQL )
Algumas diferenças mais interessantes entre FUNCTION e STORED PROCEDURE:
-
(Este ponto é copiado de uma postagem do blog . )O procedimento armazenado é um plano de execução pré-compilado onde as funções não são. Função Analisada e compilada em tempo de execução. Procedimentos armazenados, armazenados como um pseudo-código no banco de dados, ou seja, forma compilada.
-
(Não tenho certeza quanto a isso. )
O procedimento armazenado tem a segurança e reduz o tráfego de rede e também podemos chamar o procedimento armazenado em qualquer número. de aplicativos por vez. referência
-
As funções são normalmente usadas para cálculos em que os procedimentos são normalmente usados para executar a lógica de negócios.
-
Funções Não podem afetar o estado do banco de dados (Declarações que fazem commit ou rollback explícito ou implícito não são permitidas na função) Considerando que Stored procedures podem afetar o estado do banco de dados usando commit etc.
reference:J.1. Restrições em rotinas e gatilhos armazenados
-
As funções não podem usar FLUSH instruções que os procedimentos armazenados podem fazer.
-
As funções armazenadas não podem ser recursivas, enquanto os procedimentos armazenados podem ser. Observação:Os procedimentos armazenados recursivos são desabilitados por padrão, mas podem ser habilitados no servidor definindo a variável de sistema do servidor max_sp_recursion_depth com um valor diferente de zero. Consulte a Seção 5.2.3 , “Variáveis do sistema” , Para maiores informações.
-
Dentro de uma função ou gatilho armazenado, não é permitido modificar uma tabela que já está sendo usada (para leitura ou escrita) pela instrução que invocou a função ou gatilho. Bom exemplo:Como atualizar a mesma tabela na exclusão no MYSQL?
Observação :embora algumas restrições normalmente se apliquem a funções armazenadas e gatilhos, mas não a procedimentos armazenados, essas restrições se aplicam a procedimentos armazenados se forem invocados de dentro de uma função armazenada ou gatilho. Por exemplo, embora você possa usar FLUSH em um procedimento armazenado, esse procedimento armazenado não pode ser chamado de uma função armazenada ou gatilho.