[Cascavel-pm] Não dá erro quando id não existe (conexão com mysql)
Luis Campos de Carvalho
monsieur_champs em yahoo.com.br
Sexta Fevereiro 11 05:05:17 PST 2005
João Gabriel wrote:
>> Por outro lado, é certamente um erro não verificar quantas linhas
>>foram afetadas pelo seu comando SQL ou qual o status retornado pelo
>>último comando (não, não basta dizer "RaiseError" na inicialização do
>>DBI, meu caro...)
>
>
> Então eu teria que usar outro SQL pra verificar se existe o id="9999"
> e caso exista, utilizar o SQL pra deletar?
Não.
Deixa eu tentar:
#!/bin/perl
use warnings;
use strict;
use DBI;
# FASE 1: Conexão
my $dbh = DBI->Connect( $data_source, $user, $passwd,
{ RaiseError => 1, PrintError => 0 }
);
die DBI->errstr unless $dbh; # Tratamento de erro de conexão com banco
# FASE 2: Query
# Escreva sua query com placeholders.
# Isso ajuda o banco a processar entradas repetidas,
# mesmo que com certo intervalo de tempo entre elas.
#
my $query = q{DELETE FROM tabela WHERE id = ?};
# Antes de usar um query com placeholders, você precisa
# prepará-lo (i.e., enviar para o banco fazer parse dele
# e gerar um Statement Handler)
#
my $sth = $dbh->prepare( $query );
# Verifique se existe Statement Handler ou se deu erro!
die $dbh->errstr unless $sth;
# Rode o query
eval{ $sth->execute( '9999' ); }
# Verifique se aconteceram erros na execução:
die $sth->errstr if $@; # $@ é o "Eval Error".
# Descubra quantas linhas foram afetadas
my $linhas_afetadas = $sth->rows;
> Já tinha pensado nisso, mas achei quem somente com 1 SQL conseguiria
> "captar" uma mensagem do banco de dados dizendo que não encontrou
> nenhum registro com id="9999".
>
E consegue. Veja acima.
Este é o meio mais didático de fazer.
Mas você pode conseguir o mesmo efeito assim:
my $dbh = DBI->conect( $data_source, $user, $pwd, {RaiseError=>1} );
my $result =
$dbh->do( q{DELETE FROM tabela WHERE id = ?}, undef, '9999' );
# Agora, para tratar o erro, precisa de muitas linhas mais... :-)
if( $result ){
if( $result == -1 ){
# SQL usado nao se aplica a linhas
# (pode ser definição de estrutura de dados)
}elsif( $result == 0 ){
print "Query executado com sucesso, nenhuma linha afetada\n";
}elsif( $result > 0 ){
print "Query executado com sucesso, $result
linha".($result>1?'s':'')." afetada".($result>1?'s':'').".\n";
}else{
print "Um erro esquisito aconteceu, mande isso para o Tim Bunce.\n";
}else{ die $dbh->errstr; }
Espero que agora suas dúvidas estejam completamente sanadas.
Evite merdas muito grandes programando corretamente o acesso ao seu
banco de dados através do Perl.
Putamplexos, boa sorte e feliz tratamento de erros!
--
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Luis Campos de Carvalho is BSc in Comp Science,
PerlMonk [SiteDocClan], Sao Paulo PM Leader,
Unix Sys Admin && Certified Oracle DBA
http://br.geocities.com/monsieur_champs/
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Mais detalhes sobre a lista de discussão Cascavel-pm