2012-09-17 14 views
5

Espero que alguien pueda ayudar. He creado mi primera procdure almacenada (nada sofisticado), sin embargo, estoy teniendo un problema.MYSQL - Procedimiento almacenado que utiliza cadena separada por comas como entrada variable

Quiero darle una entrada de cadena tales como 1,2,3,4,5 entonces se hace un simple SELECT * FROM [TABLE] WHERE EAN IN (VAR);

lo tanto, el procedimiento almacenado se parece a esto:

-- -------------------------------------------------------------------------------- 
-- Routine DDL 
-- Note: comments before and after the routine body will not be stored by the server 
-- -------------------------------------------------------------------------------- 
DELIMITER $$ 

CREATE PROCEDURE `moments`.`new_procedure`(IN var1 VARCHAR(255)) 
BEGIN 

SELECT * FROM moments.PRODUCT WHERE EAN IN (var1); 

END 

Im am tratar de ejecutarlo como tales:

Obras

call moments.new_procedure('5045318357397') 

no funciona

call moments.new_procedure('5045318357397,5045318357427'); 

Esto ejecuta pero no DOESNT traer de vuelta a ningún resultado. ¿Se clasificar a la segunda afirmación como una cadena por lo que su hacer esto:

select * from moments.PRODUCT WHERE EAN IN ('5045318357397,5045318357427') 

y no esto:

select * from moments.PRODUCT WHERE EAN IN ('5045318357397','5045318357427') 

¿Cómo tengo que dar formato a la entrada en la consulta ejecutar para conseguir que se tome una cadena separada por comas como una entrada?

Respuesta

12

que puede usar:

SELECT * FROM moments.PRODUCT 
WHERE FIND_IN_SET(EAN, var1) 

Esto debería funcionar asumiendo que es en realidad delimitado por comas. Cualquier otro delimitador no funcionará en este caso.

+0

Esto funciona perfectamente dentro del proceso almacenado, gracias. Así es como lo llamaré desde la aplicación Cast Iron, que es una ventaja añadida. – MMKD

+2

esto funciona, pero no es muy eficiente, ya que necesita buscar todas las filas de la tabla y luego comparar cada fila con su conjunto, que a su vez también tiene que recorrer la lista separada por comas para comprobar si coincide ... Si su # de columnas es bajo, entonces está bien; de lo contrario, debería encontrar una forma de bache – Populus

+0

@El comentario de Populus necesita ser arrancado más - FIND_IN_SET no usa ningún índice de tabla, por lo que es potencialmente un gran problema de rendimiento si se usa de esta manera –

1

Suponiendo que la cadena que ha pasado de alguna manera se valida y no contiene SQL malicioso, puede utilizar declaraciones preparadas:

PREPARE stmt1 FROM CONCAT('select * from moments.PRODUCT WHERE EAN IN (',var1,')'); 
EXECUTE stmt1; 
Cuestiones relacionadas