[SP-pm] [DBI] - fetch without execute
André Garcia Carneiro
andre.garcia.carneir em terra.com.br
Terça Janeiro 9 11:14:57 PST 2007
Salve Monges!
Estou com um problema com o DBI. Tenho o seguinte código:
<codigo>
use DBI;
use strict;
my $self = shift;
my $voluntario = shift;
my $protocolo = shift;
my $periodo = shift;
my $retorno = 0;
my $sconf = new SiteConfig;
my $and_periodo = " AND CA.PERIODO ='".$periodo."' " if($periodo);
my $sth3;
my $dbh2 =
DBI->connect('dbi:'.$sconf->dbdriver.':'.$sconf->database,$sconf->dbuser,$sconf->dbpasswd,{ShowErrorStatement
=> 1,AutoCommit => 1}) or return 0;
my $SQL = "SELECT CA.ID_COLETA AS ID_COLETA
,CA.ID_VOLUNTARIO AS ID_VOLUNTARIO
,CA.ID_PROTOCOLO AS ID_PROTOCOLO
,CA.ID_ATENDENTE AS ID_ATENDENTE
,CA.DATA_CRIACAO AS DATA_CRIACAO
,CA.DATA_VENCIMENTO AS DATA_VENCIMENTO
,CA.HORA_INICIO AS HORA_INICIO
,CA.HORA_BASAL AS HORA_BASAL
,IS.NR_AMOSTRA AS NR_AMOSTRA
,IS.TEMPO AS TEMPO
,IS.HORARIO AS HORARIO
,IS.PAS AS PAS
,IS.PAD AS PAD
,IS.PULSO AS PULSO
,IS.TEMPERATURA AS TEMPERATURA
,IS.OBS AS OBS
,AT.NOME AS ATENDENTE
,P.NOME_PROTOCOLO AS NOME_PROTOCOLO
,P.PROTOCOLO AS COD_PROTOCOLO
,V.NOME AS VOLUNTARIO
FROM COLETA_AMOSTRAS CA
JOIN (ITEM_SINAIS_VITAIS IS) ON (CA.ID_COLETA = IC.ID_COLETA)
JOIN (ATENDENTE AT) ON (AT.ID_ATENDENTE = CA.ID_ATENDENTE)
JOIN (PROTOCOLO P) ON (P.NR_PROTOCOLO = CA.ID_PROTOCOLO)
JOIN (VOLUNTARIO V) ON (V.ID_VOLUNTARIO = CA.ID_VOLUNTARIO)
WHERE CA.ID_VOLUNTARIO = '".$voluntario."' AND CA.ID_PROTOCOLO = '".$protocolo."'
AND CA.TIPO = 'SV'
$and_periodo
ORDER BY IC.NR_AMOSTRA
";
print "Content-type: text/html\n\n <pre>SQL: $SQL</pre>";
$sth3 = $dbh2->prepare($SQL);
$sth3->execute;
my $result;
my $list;
my $x = 0;
my $flag = 0;
while($result = $sth3->fetchrow_hashref)
{
$list->[$x]->{id_coleta} = $result->{ID_COLETA};
$list->[$x]->{id_voluntario} = $result->{ID_VOLUNTARIO};
$list->[$x]->{id_protocolo} = $result->{ID_PROTOCOLO};
$list->[$x]->{id_atendente} = $result->{ID_ATENDENTE};
$list->[$x]->{data_criacao} = $result->{DATA_CRIACAO};
my @l = split /-/,$list->[$x]->{data_criacao};
$list->[$x]->{data_criacao} = $l[2]."/".$l[1]."/".$l[0];
$list->[$x]->{data_vencimento} = $result->{DATA_VENCIMENTO};
@l = split /-/,$list->[$x]->{data_vencimento};
$list->[$x]->{data_vencimento} = $l[2]."/".$l[1]."/".$l[0];
$list->[$x]->{hora_inicio} = $result->{HORA_INICIO};
$list->[$x]->{nr_amostra} = $result->{NR_AMOSTRA};
$list->[$x]->{tempo} = $result->{TEMPO};
$list->[$x]->{horario } = $result->{HORARIO};
$list->[$x]->{obs} = $result->{OBS};
$list->[$x]->{atendente} = $result->{ATENDENTE};
# $list->[$x]->{protocolo} = $result->{NOME_PROTOCOLO};
$list->[$x]->{protocolo} = $result->{COD_PROTOCOLO};
$list->[$x]->{atendente} = $result->{ATENDENTE};
$list->[$x]->{voluntario} = $result->{VOLUNTARIO};
$list->[$x]->{basal} = $result->{HORA_BASAL};
$x++;
}
#print STDERR Dumper $list;
$sth3->finish;
$dbh2->disconnect;
return $list;
<fim do código>
Existe um outro, parecido, que é executado primeiro, sem problema algum. Mas esse quando é executado, me
apresenta a seguinte mensagem de erro:
DBD::mysql::st fetchrow_hashref failed: fetch() without execute() [for Statement <SQL>] .
Não consigo descobrir o motivo disso. Existe um 'sth3->execute', a SQL está funcionando, o método executado
antes desse faz sth->finish e $dbh->disconnect, portanto não parece ser um problema com multi-conexões, logo eu
estou sem idéias. Alguém faz alguma idéia do que possa estar ocorrendo?
Cheers!
PS1: Sim, eu sei que dá pra formatar as datas diretamente na SQL do banco, mas eu não quis fazer por questões
pessoais!!!!
PS2: Bem-vindo texugo.... huahuahuahua : ) !!!!!
--
André Garcia Carneiro
Developer(Perl/PHP)
Member of "São Paulo Perl Mongers" - http://sao-paulo.pm.org
Mais detalhes sobre a lista de discussão SaoPaulo-pm