2012-04-29 11 views
6

He realizado un procedimiento almacenado. Quiero que filtre los datos por diferentes parámetros. Si paso un parámetro, se debe filtrar por uno; si paso dos, se debe filtrar por dos, y así sucesivamente, pero no funciona.Procedimiento almacenado de MySQL con lista de argumentos variables

¿Alguien me puede ayudar, por favor?

DROP PROCEDURE IF EXISTS medatabase.SP_rptProvince2; 
CREATE PROCEDURE medatabase.`SP_rptProvince2`(
IN e_Region VARCHAR(45) 
) 
BEGIN 

DECLARE strQuery VARCHAR(1024); 
DECLARE stmtp VARCHAR(1024); 
    SET @strQuery = CONCAT('SELECT * FROM alldata where 1=1'); 
    IF e_region IS NOT NULL THEN 
    SET @strQuery = CONCAT(@strQuery, ' AND (regionName)'=e_Region); 
    END IF; 

PREPARE stmtp FROM @strQuery; 
EXECUTE stmtp; 
END; 

Respuesta

9

AFAIK, no puede tener una lista de argumentos variables como esa. Usted puede hacer una de dos cosas:

  1. tomar un número máximo fijo de parámetros, y que no estén nula-dad antes de la concatenación:

    CREATE PROCEDURE SP_rptProvince2(a1 VARCHAR(45), a2 VARCHAR(45), ...) 
    
    ... 
    
        IF a1 IS NOT NULL THEN 
        SET @strQuery = CONCAT(@strQuery, ' AND ', a2); 
        END IF; 
    

    Si necesita campos predeterminados para el cual el los criterios en el argumento se aplican (como el parámetro e_Region en su código existente), entonces usted modifica la operación CONCAT de manera apropiada.

    posible invocación:

    CALL SP_rptProvince2('''North''', 'column3 = ''South''') 
    
  2. dar un solo parámetro que es mucho más grande que sólo 45 caracteres, y simplemente lo añaden a la consulta (suponiendo que no es nulo).

    Claramente, esto coloca la responsabilidad en el usuario para proporcionar el código SQL correcto.

    invocación posible:

    CALL SP_rptProvince2('RegionName = ''North'' AND column3 = ''South''') 
    

no hay mucho que elegir entre los dos. Cualquiera puede ser hecho para trabajar; ninguno es completamente satisfactorio.

Puede notar que hubo una necesidad de proteger las cadenas en los argumentos con comillas adicionales; ese es el tipo de cosa que hace que esto sea problemático.

+0

Gracias por publicar la respuesta. pero dame este error Error de búsqueda-Mysql Database Error: columna desconocida 'South' en 'where clause' –

+2

Se espera que pienses por ti mismo. No sé por tu comentario de dónde vino "Sur"; No sé por su pregunta a qué columna debe asociar su segundo argumento o los siguientes; No puedo decir cómo quieres llamarlo. Tienes que completar ese tipo de detalles y * pensar * por ti mismo. –

+0

im utilizando este procedimiento para informar que tengo 5 parámetros en este procedimiento si no paso un parámetro, todos los datos se deben mostrar si paso un parámetro; la vista se debe filtrar en base a uno y los otros cuatro parámetros se pasarán nulos si pasé dos parámetros, la vista se debe filtrar por dos parámetros y los otros tres se pasarán nulos, y así sucesivamente, este es el concepto del procedimiento. si pudieras ayudarme, será muy apreciado. Soy nuevo en mysql. Hice lo mismo en sqlserver 2005 y está trabajando allí, pero no funciona aquí en mysql. –

Cuestiones relacionadas