[Cascavel-pm] Res: Duvida $dbh->prepare

Patty Silva ptfzs em yahoo.com.br
Quinta Janeiro 25 07:36:34 PST 2007


Ola Luis..
Aproveitando o seu codigo, tentei implementar o codigo abaixo, so para ver c funciona:


@data_hash_references=('2007-01-23 12:00');
$variavel='Nome'';            -> essa variavel pode mudar...
$flag='BLABLA';
$id='33';
$table='tabela2';


my $sql = qq/ INSERT INTO $table(Nome,DataHora) VALUES(?,?) ON DUPLICATE KEY UPDATE ?=? /;

my ( $sth );

eval {
$sth = $dbh->prepare( $sql );

foreach my $data(@data_hash_references)
{

   $sth->execute($id,$data,$variavel,$flag);

}
$sth->commit;
};
if( $@ )
{
  $dbh->rollback;
  die "Pau de base de dados: $@";
}




So que ele da erro de Sintaxe quando ele atribui o ?=? eu acho q ele coloca uma aspas...

:D Alguem saberia dzer  o pq??


Obnrigada + uma vez...

----- Mensagem original ----
De: Luis Motta Campos <luismottacampos em yahoo.co.uk>
Para: Cascavel Perl Mongers <cascavel-pm em pm.org>
Enviadas: Quinta-feira, 25 de Janeiro de 2007 11:31:56
Assunto: Re: [Cascavel-pm] Duvida  $dbh->prepare

On Jan 25, 2007, at 12:15 PM, Patty Silva wrote:
> Bom estou tentando colocar 3 instrucoes de INSERT so que nao estou  
> conseguindo..
> Isso eh possivel?

   Não.

> my $sql=qq{INSERT into table1(Nome,DataHora) values 
> ($nome,'$datahora') on duplicate key update  
> $variavels='$result_flags';  };
> my $sql1=qq{INSERT into  table1(Nome,DataHora) values 
> ($nome,'$datahora1') on duplicate key update  
> $variavels='$result_flags';  };
> my $sql2=qq{INSERT into  table1(Nome,DataHora) values 
> ($nome,'$datahora2') on duplicate key update  
> $variavels='$result_flags';  };
>
> my $sql_insert=$sql."\n"..$sql1."\n".$sql_2;
> $sth = $dbh->prepare($sql_insert) || die $DBI::errstr;
> $sth->execute || die $DBI::errstr;


   Você deveria implementar isso assim:

   #!/usr/bin/perl
   use warnings;
   use strict;
   use DBI;

   my $dbh = DBI->connect( $dsn, $user, $passwd, { PrintError => 0,  
RaiseError => 1, AutoCommit => 0 } )
     or die "Pau na base de dados: [$DBI::errstr]\n";

   ### enquanto isso, noutra parte do seu programa...

   my $sql = <<'SQL' ;
INSERT INTO table1( Nome, DataHora )
   VALUES( ?, ? )
   ON DUPLICATE KEY UPDATE ?=?
SQL

   eval{
     my $sth = $dbi->prepare( $sql );
     foreach my $data ( @data_hash_references ){
       $sth->execute( $data->{nome}, $data->{datahora}, $data-> 
{variavels}, $data->{result_flags} );
     }
     $sth->commit;
   };
   if( $@ ){
     $dbh->rollback;
     die "Pau de base de dados: $@";
   }

> OBS: se eu colocar somente o $sql funciona.. entao nao eh problema  
> de sintaxe.. :)

   Isso acontece por que você não pode usar ';' ou qualquer outro  
limitador de instruções no SQL.
   Você tem de passar uma instrução de cada vez, ou o DBI não vai  
conseguir retornar os erros e estados da base de dados para você.

   Espero que meu exemplo seja claro o bastante.
   Eu não conheço algumas das instruções SQL que você está usando,  
mas presumi que elas funcionem desta forma...
   Putamplexos.
--
Luis Motta Campos is software engineer,
perl fanatic evangelist, and amateur {cook, photographer}


_______________________________________________
Cascavel-pm mailing list
Cascavel-pm em pm.org
http://mail.pm.org/mailman/listinfo/cascavel-pm






__________________________________________________
Fale com seus amigos  de graça com o novo Yahoo! Messenger 
http://br.messenger.yahoo.com/ 
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/cascavel-pm/attachments/20070125/e0b9d35c/attachment-0001.html 


Mais detalhes sobre a lista de discussão Cascavel-pm