utilizarlos sentencias procedimientos procedimiento preparadas ejemplos ejecutar desde almacenados almacenado php sql-server stored-procedures pdo

procedimientos - sentencias preparadas php mysqli



Valor de retorno del procedimiento almacenado PDO (7)

Pruebe $ return_value

Estoy trabajando con un procedimiento almacenado de SQL Server que devuelve códigos de error; aquí hay un fragmento muy simple del SP.

DECLARE @ret int BEGIN SET @ret = 1 RETURN @ret END

Puedo obtener el valor de retorno con la extensión mssql usando:

mssql_bind($proc, "RETVAL", &$return, SQLINT2);

Sin embargo, no puedo entender cómo acceder al valor de retorno en PDO; Preferiría no utilizar un parámetro OUT, ya que muchos de estos procedimientos almacenados ya se han escrito. Aquí hay un ejemplo de cómo estoy llamando el procedimiento en PHP.

$stmt = $this->db->prepare("EXECUTE usp_myproc ?, ?"); $stmt->bindParam(1, ''mystr'', PDO::PARAM_STR); $stmt->bindParam(2, ''mystr2'', PDO::PARAM_STR); $rs = $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC);


¿No puedes usar SELECT para devolver los resultados? ¿Entonces puedes usar un conjunto de datos (resultados en php?) Para recogerlo? No sé si conozco PHP, pero en c # es bastante simple: use un conjunto de datos.


bastante seguro PDO :: exec solo devuelve número de filas ... esto sería $ rs en tu ejemplo


Consulte MSDN para obtener información sobre cómo enlazar correctamente a este tipo de llamada

Su código PHP probablemente debería modificarse para que se parezca más a esto. Esto solo puede funcionar si realiza llamadas a través de ODBC, que honestamente es la forma más preferida de hacer cualquier cosa con SQL Server; utilice SQL Native Client en sistemas Windows y use el controlador ODT FreeTDS en sistemas * nix:

<?php $stmt = $this->db->prepare("{?= CALL usp_myproc}"); $stmt->bindParam(1, $retval, PDO::PARAM_STR, 32); $rs = $stmt->execute(); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); echo "The return value is $retval/n"; ?>

La clave aquí es que el valor de retorno puede vincularse como un parámetro OUT, sin tener que reestructurar los procedimientos almacenados.


Si entiendo tu pregunta correctamente, no deberías tener que llamar a fetchAll () ...

$stmt = $this->db->prepare("EXECUTE usp_myproc ?, ?"); $stmt->bindParam(1, $mystr, PDO::PARAM_STR); $stmt->bindParam(2, $mystr2, PDO::PARAM_STR); $rs = $stmt->execute(); echo "The return values are: $mystr , and: $mystr2";

PDOStatement :: bindParam


Solo tuve este mismo problema:

<?php function exec_sproc($sproc, $in_params) { global $database; $stmnt = $database->prepare("EXEC " . $sproc); if($stmnt->execute($in_params)) { if($row = $stmnt->fetch()) { return $row[0]; } } return -1; } ?>


public function callProcedure($sp_name = null, $sp_args = []) { try { for($i = 0; $i < count($sp_args); $i++) { $o[] = ''?''; } $args = implode('','', $o); $sth = $connection->prepare("CALL $sp_name($args)"); for($i = 0, $z =1; $i < count($sp_args); $i++, $z++) { $sth->bindParam($z, $sp_args[$i], /PDO::PARAM_STR|/PDO::PARAM_INPUT_OUTPUT, 2000); } if($sth->execute()) { return $sp_args; } } catch (PDOException $e) { this->error[] = $e->getMessage(); } }