Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Chamar um procedimento dentro de uma função lança o MySQL ERROR 1422


Existem várias instruções que causam um commit implícito, e nenhuma delas pode ser usada dentro de uma função armazenada ou um gatilho, ou em um procedimento armazenado que é chamado de uma função armazenada ou gatilho, porque isso não é realmente diferente em seu efeito líquido.

Um momento de reflexão explica o motivo disso:funções armazenadas (e gatilhos) executam enquanto uma consulta está em execução . Eles sempre, sem exceção, começam a ser executados após o início da consulta e terminam a execução antes do término da consulta. Eles também podem ser executados várias vezes durante a execução de uma única consulta, principalmente quando a consulta envolve várias linhas.

Sob essa luz, não faria sentido se fosse possível COMMIT uma transação enquanto uma única consulta está em execução... e é isso que START TRANSACTION faz, se uma transação estiver em execução -- ele confirma implicitamente a transação atual e inicia uma nova.

Isso é bom em um procedimento armazenado, desde que você não o esteja chamando no meio de outra consulta (por meio de uma função ou gatilho armazenado, que é a única maneira de invocar um procedimento no meio de outra consulta), mas fazendo o que você está fazendo aqui não é suportado... mesmo que não haja uma transação em execução, ainda não é possível iniciar uma transação no meio de uma consulta em execução.

http://dev.mysql.com/doc/refman /5.6/en/implicit-commit.html