[Cascavel-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 Cascavel-pm