[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