Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 1
            [id] => 520583
            [titulo] => Exceptions MySQL
            [dataCadastro] => DateTime Object
                (
                    [date] => 2015-05-22 11:35:27
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 262490
            [status] => A
            [isExample] => 
            [NomeUsuario] => Marisiana Battistella
            [Apelido] => Marisiana
            [Foto] => 262490_20141229171421.jpg
            [Conteudo] => 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.
        )

)

Exceptions MySQL

Lfcalegari
   - 20 mai 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.

Post mais votado

Marisiana
   - 22 mai 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.

Marisiana
   - 21 mai 2015

Olá Luis!
Eu não encontrei um exemplo no MySQL, mas no Oracle seri assim:
#Código

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;

Lfcalegari
   - 22 mai 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.

Marisiana
   - 22 mai 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:
Clique na imagem para abrir em uma nova janela

Marisiana
   - 22 mai 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:
#Código

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 http://www.mysqltutorial.org/mysql-error-handling-in-stored-procedures/

Marisiana
   - 22 mai 2015

Luis, depois informe se conseguiu fazer...

Lfcalegari
   - 25 mai 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.

Marisiana
   - 26 mai 2015

Ok.... Espero que consigas fazer!
Aguardarei o feedback...

Lfcalegari
   - 27 mai 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.

Marisiana
   - 28 mai 2015

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

Marisiana
   - 30 mai 2015

Conseguiu fazer Luis?

Marisiana
   - 30 mai 2015

Conseguiu fazer Luis?

Lfcalegari
   - 31 mai 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....

Marisiana
   - 31 mai 2015

Certo, aguardo o retorno...