Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Rafael letr

[Resolvido] Executar procedure com PDO

Recommended Posts

Estou com um problema, espero que alguém possa me ajudar.

Quando eu executo uma procedure que dentro da mesma executa outra procedure, não consigo pegar o retorno.

ALTER procedure teste1
@cCodEmp varchar (04),
@teste varchar(30) OUTPUT

as
begin
  DECLARE @nRet INT
  DECLARE @horesp varchar(10) 
  DECLARE @horbat varchar(10) 
  SET @nRet = 1
  SET @teste = 'TESTE OUTPUT'
  Execute retbatidas '0220','090010','2012-14-05', @horesp OUTPUT , @horbat OUTPUT
end
Return @nret
GO

 

 

A procedure retbatidas é somente um exemplo poderia ser qualquer outra procedure, que no caso eu usaria algumas variaves desta procedure pegando por output como mostra o exemplo.

 

O codigo php segue abaixo


$stmt = $oPdo->prepare("execute teste1 ?,?");

	$stmt->bindParam(1, $adados[0]);
	$stmt->bindParam(2, $cHorBat, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT,30);
	$stmt ->execute(); 

       echo $cHorBat;

 

 

se eu tiro a execução da outra procedure eu tenho o retorno caso contrário não.

 

Espero que possam me ajudar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente inserir o lançamento de exceptions para verificar o problema. Coloque esse código logo após a instância da PDO.

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 

Após, insira seu código em um bloco try catch e verifique o problema:

try {
  /** seu código aqui **/
}
catch (PDOException $erro) {
  echo $erro->getMessage();
}

 

As vezes, com supressão de erros, alguma coisa passa "batido" pelo desenvolvedor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não aparece erro nenhum, eu acho estranho pois executando direto na query no servidor sql ele aparece na tabela de o resultado.

 


declare @teste VARCHAR(30)
set @teste = ''
execute teste1 '',@teste OUTPUT
SELECT @teste

Imagem do sql

Mas no php ele não retorna nada.

 

$oPdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
//$stmt = $oPdo->query("exec retbatidas '".$adados[0]."','".$adados[1]."','".$adados[2]."'");
//$stmt = $oPdo->prepare("exec retbatidas ?,?,?,?,?");

$stmt = $oPdo->prepare("execute teste1 ?,?");

$stmt->bindParam(1, $adados[0]);
//$stmt->bindParam(2, $adados[1]);
//$stmt->bindParam(3, $adados[2]);
//$stmt->bindParam(4, $cHorEsp, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT,30);
$stmt->bindParam(2, $cHorBat, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT,30);
$stmt ->execute(); 

   echo $cHorBat;

} catch (PDOException $erro) {
  echo $erro->getMessage();
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha só, eu encontrei esse tópico:

http://stackoverflow.com/questions/984786/pdo-stored-procedure-return-value

 

Mas tem uma questão, o management automaticamente mostra algum retorno, é default dele. A PDO já não, você deve mandar um retorno. No link acima, após a execução do Statement, ele retorna o resultado, com o seguinte código:

$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "The return value is $retval\n";

 

Desse modo, ele possui o retorno da procedure.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde Gabriel Heming,

Já tinha chegado a ver este tópico.

 

Quando eu tiro o chamada de outra procedure de dentro da que eu estou chamando pelo php, eu obtenho o retorno, quando estou chamando uma procedure dentro da outra ainda continuo sem o retorno.

 

Não sei se tem alguma restrição sobre isto, se teria que chamar todas separadas pelo php.

 

Obrigado

 

Gostaria de saber se alguém tem uma solução para este problema!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde,

 

 

Problema foi resolvido, porém não da forma que seria correto.

Em vez de tentar pegar o retorno da procedure, dentro da procedure crio uma tabela na qual alimento os valores da mesma.

Então após executar a procedure no PHP, dou um Select na tabela criada na procedure, e consigo pegar o resultado.

 

 

Caso alguém consiga resolver recebendo o retorno direto da procedure poste para que seja possível fazer do jeito correto.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.