Em um bloco EXIT HANDLER, quais são os equivalentes MySQL de
OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID)
ERROR_MESSAGE()
Editar
O que eu quero fazer. No SQL Server eu teria
CREATE PROC ...
AS
SET NOCOUNT, XACT_ABORT ON;
BEGIN TRY
...
END TRY
BEGIN CATCH
ROLLBACK etc
EXEC someGenericProc @@PROCID, @errmsg OUTPUT;
RAISERROR ( @errmsg, 16, 1);
END CATCH
GO
CREATE PROC someGenericProc
@LoggingProcID int
AS
..
SELECT
@LoggingObject = OBJECT_SCHEMA_NAME(@LoggingProcID ) + '.' + OBJECT_NAME(@LoggingProcID),
@ErrorObject = ERROR_PROCEDURE(),
@ErrorMessage = ERROR_MESSAGE();
-- some processing to deal with nesting etc
INSERT SomeErrorTable (...)
VALUES (@LoggingObject, @ErrorObject, @ErrorMessage)
...
GO
Felicidades
Acredito que
SIGNAL
(introduzido no MySQL 5.5) seja o que você deseja, para registro automático.No entanto, a implementação atual não pode usar as várias condições, como
SCHEMA_NAME
após a execução do SIGNAL:A única informação disponível é o
MYSQL_ERRNO
andMESSAGE_TEXT
, portanto, se você quiser o schema_name, terá que incluí-lo em seuMESSAGE_TEXT
.Atualização do log de trabalho SIGNAL/RESIGNAL
Portanto, você pode definir um sinal para:
SIGNAL SQLSTATE '22012' SET MYSQL_ERRNO=1365, MESSAGE_TEXT='Division by 0'
explicitamente, mas não herdará automaticamente o texto e o número do erro apenas do sqlstate.Advertência: consegui obter algumas informações de ERRO usando RESIGNAL. Considere isto:
Porém com isso:
Exemplo (ligeiramente modificado) encontrado na documentação do RESIGNAL
Atualização2
Infelizmente, ainda não é possível criar um manipulador de exceção genérico. Aqui está uma solicitação de recurso de 6 anos atrás: http://bugs.mysql.com/bug.php?id=11660
A notícia (relativamente) boa é que a correção é criar a capacidade de visualizar a pilha de diagnósticos. Isso é bom porque o pré-requisito para esse recurso é o SIGNAL/RESIGNAL mencionado acima. A parte ruim disso é que o log de trabalho da pilha de diagnóstico ainda não está visível publicamente.
Então, por enquanto, você teria que criar um manipulador de exceção para cada estado que seu procedimento encontraria para fazer login em uma tabela e registrar apenas o número do erro (codificado, pois não está disponível pelo manipulador) e talvez o hard- texto da mensagem codificada.