procedimientos almacenados con codeigniter...Ayuda...algo sencillo por favor

3,307 views
Skip to first unread message

gastoncito89

unread,
Jun 9, 2012, 10:56:38 PM6/9/12
to CodeIgniter-spanish, gaston...@gmail.com
Hola amigos de la comunidad...quisiera saber si tienen algun ejemplo
de un procedimiento almacenado con mysql y codeigniter...porque hasta
el momento no me funcione, nose q estare haciendo mal.
mi sp en mysql es este:
DELIMITER $$

DROP PROCEDURE IF EXISTS `USP_S_USUARIOS_DATOS` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `USP_S_USUARIOS_DATOS`(
codigo INT
)
select * from usuario where idusuario=codigo $$

DELIMITER ;

Ahora en mi aplicacion lo llamo asi...
function solicitudes_lista_generales() {
$query2="call USP_S_USUARIOS_DATOS('$codigo'')";
if ($query2->num_rows() > 0) {
return $query2->result(); //sirve para mandar los datos
} else {
return false;
}
}

Pero no me funciona....les agradeceria un monton...un ejemplo sencillo
quisiera GRACIAS AMIGOS

Roberto Moreno P.

unread,
Jun 10, 2012, 12:05:46 AM6/10/12
to codeignit...@googlegroups.com, gaston...@gmail.com
Estimado,

El procedimiento almacenado en la base de datos se trabaja como cualquiera.

Ahora la forma mas "facil" segun lo que pides seria llamarlo con
Query, ya que el error en tu codigo es que estas usando $query2 como
string y no con el objeto de CI, por lo que es imposible que te
procese la consulta. Para trabajar con cualquier consulta debes usar
la siguiente sentencia

$query = $this->db->query('SELECT name, title, email FROM my_table');

Si aun asi deseas separar la consulta del objeto utiliza el siguiente formato

$consulta_sql = 'SELECT name, title, email FROM my_table';
$query = $this->db->query($consulta_sql);

En ambos casos despues simplemente trabajas con $query normalmente

Saludos

--
Roberto Andrés Moreno Pérez

marcelo gutierrez

unread,
Jun 10, 2012, 9:49:41 AM6/10/12
to codeignit...@googlegroups.com
Elgun indicio del tipo o mensaje de error? Creo que tube un problema similar alguna vez.




--
Marcelo Gutierrez

edwin_aguiar

unread,
Jun 10, 2012, 10:27:59 AM6/10/12
to codeignit...@googlegroups.com, gaston...@gmail.com
Hola Gaston y amigos de la lista
Por lo que alcance a leer, no me quedo claro tu problema. Es de la DB, del CI o de los procedimientos que deseas hacer? Como menciona acertadamente Roberto hay en el CI una serie de formas de hacer los query, con los "active records" (en la version 2.1.0 que yo manejo, ignoro las anteriores) y estan muy detalladas en el manual que podes descargar en español o en las mismas ayudas del CI que se descargan junto con el framework. 

Tambien como menciona Marcelo seria mas ilustrativo que nos pongas tus mensajes de error.

Para darte un parametro de manejo, te comento como suelo hacerlo en mis aplicaciones.
1-Uso codelobster que me permite armar el esqueleto de la aplicacion cuando inicio un nuevo proyecto e inclusive te carga los parametros de la DB para que ya quede configurado el database.php de la carpeta config.
2-En la misma carpeta, en autoload.php cargas la libreria database (en el array correspondiente) y demas cosas si asi lo deseas (models etc), fijate
3-En la base de datos ya tengo creada la DB tablas etc, ya que por una cuestion propia no suelo crearlas "en caliente" porque mis aplicaciones no son para instalar por el usuario, sino que estos son usuarios solo de datos no de administracion; pero si asi lo fuera podes crear un archivo de mysql con el sql de tu base y pedir que el instalador lo haga manualmente con cualquier manejador de db (por ejemplo phpmyadmin o similar)
4-en el controlador cargas los objetos que manejen al db segun tus necesidades, como menciona Roberto, por comodidad suelo usar los active record que son objetos muy ductiles, si tenes dudas consulta.
5-en models podes cargar tus modelos para manejar las querys si tal es el caso, muchas veces cuando son consultas simples o muy genericas los active records son lo ideal, pero si es algo un poco mas complicado me agrada (esto es algo personal) usar querys manuales. Todo eso lo podes ver en la pagina 95 del manual o en el apartado "database class" del item "Driver reference" de la ayuda del CI dentro de la distribucion.

Un cordial saludo

Roberto Moreno P.

unread,
Jun 10, 2012, 11:07:07 AM6/10/12
to codeignit...@googlegroups.com
Edwin,

En realidad lo que dices de mi comentario esta errado, ya que el
metodo query no pertenece a los "active records", si no es para
realizar consultas SQL directamente.

El problema de Gaston es que esta ejecutando la siguiente linea

$query2="call USP_S_USUARIOS_DATOS('$codigo'')";

Lo cual en otras palabras esta guardando un string en $query2 y no
procesando su consulta por lo que $query2->num_rows() arrojara un
error de inexistencia del metodo.

Aunque ahora si deseas hacer un llamado a procedimiento, con el objeto
de CI tienes esta llamada que no la he probado

$this->db->call_function('some_function', $param1, $param2, etc..);

La documentación esta en
http://codeigniter.com/user_guide/database/call_function.html

elobserva...@gmail.com

unread,
Jun 10, 2012, 11:54:14 AM6/10/12
to codeignit...@googlegroups.com
Tenes razon Roberto, lei a la disparada en el blackberry :D gracias por tu comentario

Enviado desde mi BlackBerry

marcelo gutierrez

unread,
Jun 10, 2012, 11:51:30 AM6/10/12
to codeignit...@googlegroups.com
Esto lo hice en un proyecto anterior mira la sintaxis que use y capaz te ayude un poco

    public function ObtPrestadoresPorOrganismo ($inIdOrganismo)
    {
        $result = $this->db->query("call spPrestadoresObtPorOrganismo(".$inIdOrganismo."); ") ->result_array();
        return (sizeof($result)>0)? $result: false ;   
    }

El sp esta en rojo.
$this->db->query te sirve para hacer la llamada.
result_array() te sirve para obtener el query result como array

Por ultimo tenes que ver si usas el driver mysqli para poder llamar sps desde la app.

Saludos




--
Marcelo Gutierrez

gastoncito89

unread,
Aug 27, 2012, 11:36:13 PM8/27/12
to codeignit...@googlegroups.com, gaston...@gmail.com
Muchas Gracias a Todos Amigos...despues de un tiempo...retomo el tema...logre solucionarlo...
Aqui coloco lo basico...para que lo tengan en cuenta.
1ro habilitar en la conexion el driver con el siguiente nombre; mysqli.

2do 
creo los procedimientos almacenados

//Para insertar sencillo sin parametros
create procedure listarclientes
(
)
select *from clientes

//Para insertar sencillo
create procedure insertacliente
(
p_nombres varchar(40),
p_apellidos varchar(40)
)
insert into clientes(Nombres,Apellidos) values(p_nombres , p_apellidos);

3ro en el controlador
function foros(){
       $this->load->model('Foro');
        $datos=$this->Foro->traer_datos();
        $data['datos']=$datos;
        $this->load->view('principal',$data);
    }
    function foros2(){
       $this->load->model('Foro');
        $nombre=$this->input->post('nombre2');
        $apellido=$this->input->post('apellido2');
        $datos=$this->Foro->insertar_datos($nombre,$apellido);
        if($datos){
           echo "correcto";
        } else{
           echo "incorrecto";
        }
    }

4to//En el modelo
function traer_datos(){
        $query="call listarclientes();";
        $query2=$this->db->query($query);
        if($query2->num_rows()>0){
            return $query2->result();//row() fila
        }else{
            return false;
        }

function insertar_datos($nombre,$apellido){
        $query="call insertacliente('$nombre','$apellido')";
        $query2=$this->db->query($query);
        return $query2;
...
Eso es todo...si alguien tiene otra forma...Gracias...Son lo maximo
Reply all
Reply to author
Forward
0 new messages