Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Se puede llegar a crear un Stored Procedure?

Estas en el tema de Se puede llegar a crear un Stored Procedure? en el foro de Mysql en Foros del Web. Buenos días, Tengo dos tablas, una de productos y otra de imagenes, las cuales tienen la siguiente estructura que podéis ver en la imagen. Si ...
  #1 (permalink)  
Antiguo 27/02/2012, 04:04
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Se puede llegar a crear un Stored Procedure?

Buenos días,

Tengo dos tablas, una de productos y otra de imagenes, las cuales tienen la siguiente estructura que podéis ver en la imagen.



Si solo tuviese que dar de alta un producto con su imagen bien. Pero el problema es que un producto puede tener más de una imagen, y aquí es donde se me destroza el Stored Procedure que si son varias imagenes no veo ninguna forma de hacerlo.

Mi pregunta es si existe alguna forma de crear un Store Procedured para que cuando inserte el producto, también se inserte las imagenes del producto en la tabla imagenes.

¿Existe alguna forma hacerlo con SP o triggers?

Muchas gracias de antemano!
  #2 (permalink)  
Antiguo 27/02/2012, 07:13
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 14 años, 2 meses
Puntos: 331
Respuesta: Se puede llegar a crear un Stored Procedure?

Existen varias formas, el problema es que no explicas cuál es el origen de datos. Cómo sabes que un artículo tiene más de una imagen? De qué manera llamaras al procedimiento? De dónde provienen los datos? Está claro que con un for o while dentro del SP lo arreglas, pero antes tienes que diseñarlo. Saludos,
__________________
Fere libenter homines, id quod volunt, credunt.
  #3 (permalink)  
Antiguo 27/02/2012, 09:06
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Se puede llegar a crear un Stored Procedure?

Cita:
Iniciado por repara2 Ver Mensaje
Existen varias formas, el problema es que no explicas cuál es el origen de datos. Cómo sabes que un artículo tiene más de una imagen? De qué manera llamaras al procedimiento? De dónde provienen los datos? Está claro que con un for o while dentro del SP lo arreglas, pero antes tienes que diseñarlo. Saludos,
Perdón si me dejé datos, aquí están :D

El origen de datos es un XML, que leo y proceso, en ese mismo XML puedo saber si tiene una o más de una imagen el producto.

De qué manera llamaré al procedimiento? lo haré con PHP, no se si te referías a eso.

En cuanto a lo que dices que con un for o while dentro del SP lo arreglo, me podrías poner un ejemplo?

Tengo claro los dos inserts, pero no como manipular el SP para que inserte varias imagenes :S

Muchas gracias de antemano!
  #4 (permalink)  
Antiguo 27/02/2012, 09:13
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 14 años, 2 meses
Puntos: 331
Respuesta: Se puede llegar a crear un Stored Procedure?

Si los datos vienen de un XML, entonces antes de llamar al SP deben estar ya parseados. La info de las imágenes es un array con los nombres de archivos que se pasará como parámetro al SP. La manera de hacer el insert se explica aquí: http://forums.mysql.com/read.php?98,...416#msg-156416
Si tienes claros los inserts, entonces simplemente tienes que hacer un insert por cada elemento del array que se pasa como parámetro. Si no te ayudo o no te srive el ejemplo postea el código y las tablas. Saludos
__________________
Fere libenter homines, id quod volunt, credunt.
  #5 (permalink)  
Antiguo 27/02/2012, 13:43
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Se puede llegar a crear un Stored Procedure?

Hola Repara2, gracias por ayuda.

La parte del código es así

Código PHP:
Ver original
  1. <?php
  2. // Funciones de insertar
  3. function inserta_Producto_En_BD($titulo,$descripcion,$precio,$baseDatos){
  4.    
  5.     $query = "INSERT INTO productos (titulo, descripcion,precio)
  6.                 VALUES (:titulo,:descripcion,:precio)";
  7.     $comando = $baseDatos->prepare($query);
  8.     $comando->execute(array(':titulo'=>$titulo,
  9.                             ':descripcion'=>$descripcion,
  10.                             ':precio'=>$precio,
  11.                             ));                            
  12. }
  13.  
  14. function inserta_Imagenes_En_BD($id_producto,$imagenes,$ruta,$baseDatos){
  15.    
  16.         $query = "INSERT INTO imagenes (id_producto,imagen, ruta)
  17.                     VALUES (:id_producto,:imagen,:ruta)";
  18.         $comando = $baseDatos->prepare($query);
  19.         $comando->execute(array(':id_producto'=>$id_producto,
  20.                                 ':imagen'=>$imagenes,
  21.                                 ':ruta'=>$ruta,
  22.                                 ));    
  23.  
  24. }
  25. // Parte donde sé si tiene más de una imagen
  26. if (count($imagenes->imagen) == 1){ // Solo tiene una imagen
  27.     $imagen = $imagenes->imagen;
  28.                                
  29. }else{ // Contiene varias imagenes
  30.         foreach ($imagenes->imagen as $imagen){
  31.                                
  32.                                
  33.         }  
  34. }
  35.  
  36. //Llamadas a las funciones de insertar
  37. inserta_Producto_En_BD($titulo,$descripcion,$precio,$baseDatos);
  38. inserta_Imagenes_En_BD($imagenes,$ruta,$baseDatos);
  39. ?>


La llamada al SP entiendo que debería ser pasandoles los parametros de ambos inserts.

Código PHP:
Ver original
  1. //Llamar al SP
  2. $query = "CALL sp_altaProducto (:titulo,:descripcion,:precio,:imagenes,:ruta)";
  3. $comando = $baseDatos->prepare($query);
  4. $comando->execute(array(':titulo'=>$titulo,
  5.                     ':descripcion'=>$descripcion,
  6.                     ':precio'=>$precio,
  7.                     ':imagenes'=>$imagenes,
  8.                     ':ruta'=>$ruta));

Y la creación de este SP es lo que no acabo de ver como hacer el bucle. Al SP comentas de pasarle el array de imagenes y que él dentro sepa si tiene una o varias imagenes? en lugar de hacerlo fuera del SP, se trata de hacerlo dentro, no?

Pero como calculas dentro del SP si tiene una o más de una imagen?

Muchas gracias de antemano!
  #6 (permalink)  
Antiguo 27/02/2012, 14:01
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 14 años, 2 meses
Puntos: 331
Respuesta: Se puede llegar a crear un Stored Procedure?

No entiendo para qué haces un Sp cuando ya lo tienes resuelto por código PHP. La solución es la que posteas en el código 1, y dentro del foreach llamas a inserta_Imagenes_En_BD() por cada imagen que quieras insertar. Si aún quieres resolverlo por SP, entonces, el parámetro imagenes lo pasas como un string php de la forma "1.jp;2.png;x.gi" etc.. separado por algún caracter delimitador. Luego, a tu SP le pasas esa cadena y dentro del sp haces lo que explican aquí: http://kedar.nitty-witty.com/blog/my...ring-into-rows
Te comento que este tipo de cosas es mucho más simple y barato hacerlo por PHP. Además, los SP no son portables y requieren un trabajo de mantenimiento mayor. Mira el ejemplo a ver qué pasa.
__________________
Fere libenter homines, id quod volunt, credunt.
  #7 (permalink)  
Antiguo 27/02/2012, 14:29
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Se puede llegar a crear un Stored Procedure?

Cita:
Iniciado por repara2 Ver Mensaje
No entiendo para qué haces un Sp cuando ya lo tienes resuelto por código PHP. La solución es la que posteas en el código 1, y dentro del foreach llamas a inserta_Imagenes_En_BD() por cada imagen que quieras insertar. Si aún quieres resolverlo por SP, entonces, el parámetro imagenes lo pasas como un string php de la forma "1.jp;2.png;x.gi" etc.. separado por algún caracter delimitador. Luego, a tu SP le pasas esa cadena y dentro del sp haces lo que explican aquí: http://kedar.nitty-witty.com/blog/my...ring-into-rows
Te comento que este tipo de cosas es mucho más simple y barato hacerlo por PHP. Además, los SP no son portables y requieren un trabajo de mantenimiento mayor. Mira el ejemplo a ver qué pasa.
Sí por php se puede hacer, pero creia que la gracía de los SP es que se compilan y son mucho más rápidos, no? no entiendo por qué es más barato por php que por SP...
Me acabas de romper un mito :D

En cuanto al enlace, veo la idea y me parece buena, lo que no me parece tan buena es la complejidad para crear el SP, se me eleva bastante!

Saludos!
  #8 (permalink)  
Antiguo 27/02/2012, 14:39
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 14 años, 2 meses
Puntos: 331
Respuesta: Se puede llegar a crear un Stored Procedure?

En este caso concreto que es una simple inserción con info proveniente de la aplicación, es mejor y más potente PHP. Cuando hay de por medio eventos y trigers entonces no te queda otra que un SP. El tema es que programar en la base de datos requiere, primero, que aprendas un nuevo lenguaje, segundo, un mantenimiento aparte, no son portables, etc. La tendencia en este momento es dejar el trabajo de la Db a una capa de abstracción y concentrarse en lo posible en un sólo código / sistema. De ahí la popularidad de Propel, Doctrine y otros ORM. A mí me gusta bastante el tema de los SP, hice unos cuantos en Oracle con buenos resultados, pero en un equipo de trabajo pequeño, con una DB mediana o pequeña un lenguage más se hace difícil de llevar cuando los beneficios no son muchos. En projectos grandes la simplicidad se agradece y estas pequeñas cosas hacen que el desarrollo se vuelva insoportable. Claro que tú tienes que hacer tu propia experiencia.
__________________
Fere libenter homines, id quod volunt, credunt.
  #9 (permalink)  
Antiguo 27/02/2012, 15:01
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Se puede llegar a crear un Stored Procedure?

Muchas gracias,

Estaba pensando alternativas para solucionar el problema con SP, y se me ocurre crear un SP y usarlo cuando tenga solo una imagen del producto y evitar la llamada al SP cuando haya más de una imagen.

El SP me quedaría relativamente sencillo, porque no tendría que splitar imagenes ni nada por el estilo. Podría hacer mi insert en la tabla productos y el otro en la tabla imagenes.

El proyecto puede contener tantos productos como productos tiene amazon xD igual si que notaría algo de mejoría en tiempos con el SP para productos con una sola imagen.

¿Vosotros que creeis? dejo los SP para cosas mas complicadas que dos inserts en dos tablas?
  #10 (permalink)  
Antiguo 28/02/2012, 00:31
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 14 años, 2 meses
Puntos: 331
Respuesta: Se puede llegar a crear un Stored Procedure?

se me ocurre crear un SP y usarlo cuando tenga solo una imagen del producto y evitar la llamada al SP cuando haya más de una imagen. es una mala solución desde el punto de vista de diseño dos códigos que hacen lo mismo en distintas plataformas. Si estás uilizando, por ejemplo, un Webservice de Amazon, entonces ni siquiera guardes las imágenes, leelas de Amazon cada vez que te hagan falta. Respecto del SP y todo eso, es muy difícil optimizar la inserción, no hay casi diferencia entre hacerlo por PHP o por SP, supongo que depende de las ganas de trabajar que tengas. Saludos
__________________
Fere libenter homines, id quod volunt, credunt.

Etiquetas: stored, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:40.