[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