Ir para conteúdo
Fórum Script Brasil
  • 0

Mensagem de erro em Procedure com Transaction


Mauro Speca

Pergunta

Olá Pessoal, estou tendo uma certa dificuldade com uma procedure.

Ainda não tenho muita experiencia com procedures de mysql então se alguém puder me ajudar.

Tenho a seguinte procedure:

CREATE DEFINER=`user`@`%` PROCEDURE `InserirProduto`(pCodigo Varchar(8), pDescricao Varchar(60), pPrecoVenda FLOAT, pPrecoCompra FLOAT)
BEGIN

DECLARE erro INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET erro = 1;


START TRANSACTION;
INSERT
INTO Produto(Codigo, Descricao, PrecoVenda, PrecoCompra, Desabilitado)
VALUES (pCodigo, pDescricao, pPrecoVenda, pPrecoCompra,0);

INSERT INTO EstoqueProduto (IDproduto, QUantidadeDisponivel)
SELECT IDProduto, 0 FROM Produto where Codigo = pCodigo;

IF erro = 1 THEN
ROLLBACK;
ELSE
COMMIT;

END IF;
END
Que chamo pela função de php:
mysqli_query("CALL InserirProduto('1','1',99.00,20.00)") or die (mysqli_error());
Mas o que acontece, o campo cod da tabela é único, mas se eu tento adicionar um cod duplicado ele executa a query e não acusa erro nenhum, não insere na tabela mas tb não retorna erro nenhum. Não sei se é possível mas estava pensando em talvez algo assim:
CREATE DEFINER=`user`@`%` PROCEDURE `InserirProduto`(pCodigo Varchar(8), pDescricao Varchar(60), pPrecoVenda FLOAT, pPrecoCompra FLOAT)
BEGIN

DECLARE erro INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET erro = 1;


START TRANSACTION;
INSERT
INTO Produto(Codigo, Descricao, PrecoVenda, PrecoCompra, Desabilitado)
VALUES (pCodigo, pDescricao, pPrecoVenda, pPrecoCompra,0);

INSERT INTO EstoqueProduto (IDproduto, QUantidadeDisponivel)
SELECT IDProduto, 0 FROM Produto where Codigo = pCodigo;

IF erro = 1 THEN
ROLLBACK;
ShowMessage(mysql_error());
ELSE
COMMIT;

END IF;
END

Mas sinceramente sei que esse não é o caminho, queria alguma função do próprio mysql pra mostrar a mensagem de erro que causa a EXCEPTION

se alguém puder me ajudar agradeço

Editado por Mauro Speca
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Oi,'Mauro Speca'

Este é um problema em que ainda não obtive uma solução oficial da MySQL AB.

Minha solução caseira foi fazer a procedure retornar um parametro.

Crie um parametro do tipo OUT.

Internamente informe o resultado de sua operação.

Teste com select o resultado retornado pela variável.

CREATE DEFINER=`user`@`%` PROCEDURE `InserirProduto`(pCodigo Varchar(8), pDescricao Varchar(60), pPrecoVenda FLOAT, pPrecoCompra FLOAT, OUT resultado CHAR(4))
...
SET resultado = 'OK';

START TRANSACTION;
...
IF erro = 1 THEN
    SET resultado = 'ERRO';
    ROLLBACK;
ELSE
    COMMIT;
END IF;
END

Link para o comentário
Compartilhar em outros sites

  • 0
Oi,'Mauro Speca'

Este é um problema em que ainda não obtive uma solução oficial da MySQL AB.

Minha solução caseira foi fazer a procedure retornar um parametro.

Crie um parametro do tipo OUT.

Internamente informe o resultado de sua operação.

Teste com select o resultado retornado pela variável.

CREATE DEFINER=`user`@`%` PROCEDURE `InserirProduto`(pCodigo Varchar(8), pDescricao Varchar(60), pPrecoVenda FLOAT, pPrecoCompra FLOAT, OUT resultado CHAR(4))
...
SET resultado = 'OK';

START TRANSACTION;
...
IF erro = 1 THEN
    SET resultado = 'ERRO';
    ROLLBACK;
ELSE
    COMMIT;
END IF;
END

Oi Denis, obrigado pela ajuda, mas eu gostaria de retornar o erro em si, por exemplo se for duplicado retornar aquela mensagem "duplicate key".

A mesma mensagem de erro que dá quando você executa um mysql_error()

não sei se soube explicar

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...