Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

andersonpda

exception procedure

Recommended Posts

Olá gostaria de saber se tem como eu gerar minhas proprias exception dentro das procedures, com minhas mensagens personalizadas...? dai pararia o script PHP retornando o erro especifico do banco...?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola andersonpda!

 

Se eu entendi bem o que você quer lhe digo que é possivel sim executar tal tarefa.

 

Vou postar um exemplo básico de uma procedure que uso nos sistemas que desenvolvo:

 

Criação da tabela:

 

CREATE TABLE `prcidades` (
  `cd_cidade` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `nm_cidade` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`cd_cidade`)
)
ENGINE = InnoDB;

 

A procedure abaixo servirá para popular a tabela criada acima

 

CREATE PROCEDURE `sp_nome_procedure`(IN var_nome_cidade VARCHAR(100), OUT resposta VARCHAR(50))
SALVAR:BEGIN
		DECLARE excecao SMALLINT DEFAULT 0;
		DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET excecao = 1;
		START TRANSACTION;
				INSERT INTO prcidades (cd_cidade, nm_cidade) VALUES (NULL, var_nome_cidade);
		IF excecao = 1 THEN
				SET resposta = 'Erro ao gravar dados';
				ROLLBACK;
				LEAVE SALVAR;
		ELSE
				SET resposta = 'Salvo com sucesso!';
				COMMIT;
		END IF;
END

No script sao passados 2 parametros, 1 de entrada (IN) e outro de saida (OUT). É com este valor de saida que você irá interagir com o php.

 

Após o BEGIN é declarada uma variavel chamada "excecao" e define-se a mesma do tipo SMALLINT que por padrão possui valor 0.

 

Na linha abaixo declara-se que se o sql cair na exceção a variavel irá obter valor 1.

 

Logo inicia-se a transação, após a query (poderão existir várias querys) existe um IF para verificar o valor da variavel excecao, caso seja 1 (caso o sql caiu no exception) é setado a mensagem de erro na variavel "resposta", em seguida é dado o ROLLBACK na base para limpar todas as alteraçoes feitas com as querys e logo a procedure é encerrada com o operador LEAVE.

 

Caso o sql não tenha caido o exception a resposta é setada com uma mensagem de ok e logo é feita a validação de todas as alterações com o operador COMMIT.

 

Detalhe: o commit e o rollback só ira funcionar caso a tabela seja criada com o tipo INNODB, pois este garante a integridade dos dados inseridos, MYISAM não dá suporte a transações.

 

Aqui está pronta a parte do BD, agora vem o php...

 

<?php

//chamar a procedure
$sql = "CALL sp_nome_procedure('JARAGUA DO SUL', @resposta);

// executa query
$query = mysql_query($sql);

// busca valor de saida (OUT) da procedure
$busca_resposta = mysql_query("SELECT @resposta");

// com a funcao mysql_result vamos atribuir este resultado em uma variavel
$resultado = mysql_result($busca_resposta, 0, "@resposta");

// mostra resposta vinda do banco
echo $resultado;


?>

Detalhe: O parâmetro de saida é chamado acompanhado do "@"

 

Acho que é isso

Espero ter ajudado!

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.