
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.
Y si hago la llamada desde PHP, no devuelve nada:
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
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


0