Exceptions MySQL

SQL Server

SQL

MySQL

PostgreSQL

NoSQL

Oracle

SQLite

Firebird

20/05/2015

Olá pessoal boa tarde!

Bom eu gostaria de saber como faço para capturar um exception (ex. EXCEPTION WHEN DUP_VAL_ON_INDEX THEN) e envia-la para linguagem hospedeira em uma procedure do MYSQL.
Luis Calegari

Luis Calegari

Curtidas 0

Melhor post

Marisiana Battistella

Marisiana Battistella

22/05/2015

Entendi... Não sei como é o tratamento de exceções no MySQL, mas vou ver se encontro alguma informação sobre isso e compartilho contigo.
GOSTEI 1

Mais Respostas

Marisiana Battistella

Marisiana Battistella

20/05/2015

Olá Luis!
Eu não encontrei um exemplo no MySQL, mas no Oracle seri assim:
CREATE OR REPLACE PROCEDURE add_new_supplier
   (supplier_id_in IN NUMBER, supplier_name_in IN VARCHAR2)
IS

BEGIN
   INSERT INTO suppliers (supplier_id, supplier_name )
   VALUES ( supplier_id_in, supplier_name_in );

EXCEPTION
   WHEN DUP_VAL_ON_INDEX THEN
      raise_application_error (-20001,'You have tried to insert a duplicate supplier_id.');

   WHEN OTHERS THEN
      raise_application_error (-20002,'An error has occurred inserting a supplier.');

END;
GOSTEI 0
Luis Calegari

Luis Calegari

20/05/2015

Olá Marisiana!

Então esse é o problema... Nas explicações que eu encontrei até agora diz que no MySql não existe o bloco de EXCEPTIONS. Me parece que no MySql você tem que criar um tal de "Handler" quem não faço a minima ideia do que é, muito monos como criar um. Estou a procura de um exemplo.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

20/05/2015

Neste link, Oracle to MySQL Migration, temos um comparativo dos recursos do Oracle com os recursos do MySQL.
No tratamento de exceções há o seguinte:
[img]http://arquivo.devmedia.com.br/forum/imagem/262490-20150522-123420.png[/img]
GOSTEI 1
Marisiana Battistella

Marisiana Battistella

20/05/2015

Não tenho o MySQL instalado e, por isso, não sei como se aplica. Mas segue um exemplo de como aplicar em uma procedure:
DELIMITER $$
 
CREATE PROCEDURE insert_article_tags(IN article_id INT, IN tag_id INT)
BEGIN
 
 DECLARE CONTINUE HANDLER FOR 1062
 SELECT CONCAT('duplicate keys (',article_id,',',tag_id,') found') AS msg;
 
 -- insert a new record into article_tags
 INSERT INTO article_tags(article_id,tag_id)
 VALUES(article_id,tag_id);
 
 -- return tag count for the article
 SELECT COUNT(*) FROM article_tags;
END

Explicações em [url]http://www.mysqltutorial.org/mysql-error-handling-in-stored-procedures/[/url]
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

20/05/2015

Luis, depois informe se conseguiu fazer...
GOSTEI 0
Luis Calegari

Luis Calegari

20/05/2015

Marisiana desculpa a demora... Eu ainda não consegui o resultado que qria porque não entendi muito bem como funciona o Hendler... Mais este tutorial está me ajudando muito.. assim que eu conseguir o resultado esperado.... eu coloco a procedure aqui.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

20/05/2015

Ok.... Espero que consigas fazer!
Aguardarei o feedback...
GOSTEI 0
Luis Calegari

Luis Calegari

20/05/2015

Agora surgiu uma outra dúvida...
Qria fazer uma trigger...
segue exemplo.

CREATE TRIGGER ATUALIZA_ESTOQUE
AFTER INSERT ON ITENSVENDA FOR EACH ROW
BEGIN

DECLARE ESTOQUE_ATUAL;

SELECT PRO_QTDE INTO ESTOQUE_ATUAL FROM PRODUTO WHERE PRO_CODIGO = NEW.PRO_CODIGO;

DECLARE PRODUTO_OUT_ESTOQUE CONDITION ESTOQUE_ATUAL - NEW.PRO_QTDE >= 0;
DELCARE EXIT HANDLER FOR PRODUTO_OUT_ESTOQUE UPDATE 'Quantidade na nota excede a quantidade do produto em estoque';

UPDATE PRODUTO
SET PRO_ESTOQUE = PRO_ESTOQUE - NEW.PRO_QTDE
WHERE PRO_CODIGO = NEW.PRO_CODIGO;
END


a parte que está logo abaixo do primeiro "select" da erro.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

20/05/2015

Eu acho q a forma como vc declarou não está correta....
Observe o exemplo que consta no tutorial que te passei à cima.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

20/05/2015

Conseguiu fazer Luis?
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

20/05/2015

Conseguiu fazer Luis?
GOSTEI 0
Luis Calegari

Luis Calegari

20/05/2015

Ainda não consegui... eu acabei resolvendo o problema de outra maneira...
fiz uma tragger que chama uma procedure... e nela eu mando uma variável de saída para pegar uma msg pré definida...
ai eu não deixo que a exception aconteça... segunda eu posto como eu fiz... isso foi feito no meu ambiente de trabalho...
mais ainda estou a procura de como resolver isso utilizando um handler....
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

20/05/2015

Certo, aguardo o retorno...
GOSTEI 0
POSTAR