MySQL - Stored procedure con where dinámico

   
Vista:

Stored procedure con where dinámico

Publicado por Marta (1 intervención) el 02/09/2015 01:35:05
Buenas,
Si ejecuto el siguiente procedimiento en phpmyadmin, con los parámetros 0,0,"", devuelve 152 registros.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DROP PROCEDURE `totalPisosCases`;
CREATE DEFINER=`root`@`localhost` PROCEDURE `totalPisosCases`(OUT `regs` INT, IN `op` INT, IN `ob` INT, IN `barris` TEXT) NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER BEGIN
    SET @query = "SELECT COUNT(*) INTO @regs FROM t_un WHERE (t_un.familia = 3 OR t_un.familia = 4)";
    IF op = 1 THEN
        SET @query = CONCAT(@query, " AND t_un.operacion = 4");
    END IF;
    IF op = 2 THEN
        SET @query = CONCAT(@query, " AND t_un.operacion = 3");
    END IF;
    IF ob = 1 THEN
        SET @query = CONCAT(@query, " AND (t_un.referencia < 7000 OR t_un.referencia > 9999)");
    END IF;
    IF ob = 2 THEN
        SET @query = CONCAT(@query, " AND t_un.referencia >= 7000 AND t_un.referencia <= 9999");
    END IF;
    IF barris != "" THEN
        SET @query = CONCAT(@query, barris);
    END IF;
    PREPARE stmt FROM @query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    SET regs = @regs;
END

Y si hago la llamada desde PHP, no devuelve nada:

1
2
3
4
$rCall = mysql_query("CALL totalPisosCases(@total, $pr1, $pr2, $pr4)");
    $rRet = mysql_query("SELECT @total");
    $row = mysql_fetch_row($rRet);
    echo $row[0];

Dónde $pr1 = $pr2 = 0 y $pr4 = ""

Si modifico el procedimiento eliminando el último parámetro (barris), devuelve los 152 registros.
Este último parámetro puede estar vacío o bien contener, por ejemplo " AND (CodigoPostal = 99999 OR CodigoPostal = 88888). Puede ser un sólo código postal, ninguno, cuatro, ....

He añadido un parámetro de salida para visualizar como queda la variable @query y su sintaxis es correcta. Algo tiene que haber, que desconozco, en la forma de pasar el último parámetro.

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Stored procedure con where dinámico

Publicado por leonardo_josue (81 intervenciones) el 03/09/2015 16:26:09
Hola Marta:

No estoy familiarizado con la sintaxis de PHP, sin embargo, en otros lenguajes de programación debes tener cuidado cuando trabajas con cadenas, y me refiero al último de los parámetros que es también de tipo cadena, por ejemplo, en linux si haces algo como esto:

1
2
~$ param1=1
~$ param2="1"

es decir, declaras dos parámetros, el primer parámetro de tipo numérico y el segundo parámetro de tipo String o cadena. si imprimes esto dentro de una cadena", es decir

1
~$ echo "$param1 - $param2"

el resultado que obtienes es algo así:

1
1 - 1

es decir, los dos calores se imprimen "igual"... en el caso de MySQL es importante el manejo de las comillas para definir que estás hablando de una cadena, por lo tanto, en la "cadena" debes considerar también poner comillas:

1
2
echo "$param1 - \"$param2\""
1 - "1"

Igual y por ese lado puede estar el problema.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar