Ejecutar Procedimientos Almacenados con Symfony y Doctrine
En muchos proyectos que parten de cero, se pueden utilizar alternativas al uso de procedures.
Pero en ocasiones, nos encontramos con modelos de datos en producción que son usados por aplicaciones cliente servidor, web que no podemos modificar lo que nos lleva a utilizar los recursos disponibles y adaptarnos lo mejor posible a la arquitectura y estructura que tiene el cliente.
Una sencilla forma de ejecutar un procedimiento almacenado con symfony y orm doctrine sería esta:
$name_proc = 'Nombre_Procedimiento';
$dsn = 'mssql:dbname=DatabaseName;host=Servidor';
$user = 'guest';
$password = '';
try{
$dbh = new PDO($dsn, $user, $password);
$conn=Doctrine_Manager::getInstance()->getCurrentConnection() ;
$conn->prepare($name_proc);
$q= $conn->fetchAll($name_proc,array(10));
}
catch (PDOException $e){
throw new sfDatabaseException(sprintf('PDOException was thrown when trying to manipulate session data. Message: %s', $e->getMessage()));
}
Este ejemplo ejecuta un procedimiento almacenado sobre Sql Server, con cambiar el dsn se podría ejecutar en MySql 5+
Espero que haya sido útil

April 27, 2010 - 8:18 PM
y como le envias los parametros q llegara a necesitar?
April 27, 2010 - 8:38 PM
Hola Salvatore
Gracias por tu comentario
No lo he probado, pero debería funcionar algo como
$name_proc = ‘Nombre_Procedimiento’.’ ‘.$params;
Espero tu respuesta!
April 27, 2010 - 9:40 PM
mira de esta manera:
$q= $conn->fetchAll($name_proc.’ ? ‘,array($usuario));
envias un parametro, pero hasta ahorita no he podido enviar mas de dos y mi procedimiento pide mas de dos.
April 27, 2010 - 9:42 PM
espero puedas ayudarme
April 28, 2010 - 10:14 AM
Hola salvaro!
El objetivo de triggers y procedimientos almacenados suele ser entre otros descargar de trabajo al servidor web y trabajar a nivel de lógica de negocio y acceso a datos desde el propio SGBB.
Tal vez a nivel de rendimiento no te interesa enviar tantos parámetros a un procedimiento almacenado, sino obtenerlos de tus tablas (en función de la volumetría claro está).
¿Qué error genera cuando envías más de dos parámetros?
¿Qué SGBD estás usando?
¿Has probado a concatenarlos directamente en $name_proc en vez de en el fetch?
April 28, 2010 - 3:28 PM
bueno cuando le envio un solo parametro me manda este error:
General error: 10007 El procedimiento ’sp_Login_Bdv’ precisa el par�metro ‘@passwd’, que no se ha especificado. [10007] (severity 5) [(null)]
y si concateno los demas parametros asi:
$q= $conn->fetchAll($name_proc.’ ? ‘,array($usuario).’, ?’,array($pass));
me manda el siguiente error:
Catchable fatal error: Argument 2 passed to Doctrine_Connection::fetchAll() must be an array, string given, called in E:\ProyectosSF\Adquisiciones\apps\adquisiciones\modules\usuarios\actions\actions.class.php on line 56 and defined in E:\ProyectosSF\Adquisiciones\lib\vendor\symfony\lib\plugins\sfDoctrinePlugin\lib\vendor\doctrine\Doctrine\Connection.php on line 798
si lo hagoi asi:
$q= $conn->fetchAll($name_proc.’ ? ‘,array(‘usuario’=>$usuario,’pass’=>$pass));
me manda esto:
Invalid parameter number: number of bound variables does not match number of tokens
o como podria concatenarlos, perdona mi inexperiencia. Gracias. Estoy usando sql server 2000
May 2, 2010 - 4:46 PM
Puedes concatenar los arrays usando array_merge
October 19, 2010 - 1:13 AM
Gracias por tu artículo, está muy interesante.
A proposito, sabes como mejorar el mensaje que se muestra por pantalla. Personalizar para que en estos casos muestre el error específico que manda la BD.
October 19, 2010 - 1:07 PM
Hola Alejandro!
A qué mensaje te refieres?