2011-12-18 9 views
7

El objetivo es modificar una cadena de consulta dentro de un procedimiento almacenado Mysql basado en variables de entrada.Mysql construye dinámicamente cadena de consulta en un procedimiento almacenado basado en lógica

Algo como esto:

CREATE DEFINER=`root`@`localhost` PROCEDURE `func`(type VARCHAR(15)) 
BEGIN 
    SET @type = type; 

    -- Check for the sort parameter 
    if @type="asc" THEN 
     SET @sort = " order by name asc"; 
    elseif @type="desc" THEN 
     SET @sort = " order by name desc"; 
    else 
     SET @sort =""; 
    end if; 

SELECT id, name from table @sort; 

END  
+1

La solución es utilizar ejecutar y concat: CREATE DEFINER = 'root' @ 'localhost' PROCEDURE' test' (entrada VARCHAR (15)) BEGIN SET @input = entrada; if @ input = "asc" then SET @sort = "orden por ActivityLogKey asc"; elseif @input = "desc" luego SET @sort = "ordenar por ActivityLogKey desc"; else SET @sort = ""; final si; SET @query = CONCAT ('select * from activitylog', @ sort, 'limit 0, 5'); PREPARE stmt FROM @query; EJECUTAR stmt; DEALLOCATE PREPARE stmt; END –

+0

Si esta es la solución por la que no la agregó como respuesta y la acepta o edita su pregunta con ella. –

+0

Sin 100 reputación, tengo que esperar 8 horas para responder mi propia pregunta –

Respuesta

13

La solución es utilizar ejecutar y concat:

CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(input VARCHAR(15)) 
BEGIN 
SET @input = input; 

if @input="asc" then 
    SET @sort = " order by ActivityLogKey asc"; 
elseif @input = "desc" then 
    SET @sort = " order by ActivityLogKey desc"; 
else 
    SET @sort =""; 
end if; 

SET @query = CONCAT('select * from activitylog ',@sort,' limit 0, 5'); 

PREPARE stmt FROM @query; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

END 
+0

La utilidad que encontré para esto es poder insertar uniones, campos o cualquier otro código SQL como parte del proceso almacenado en lugar de en PHP. Parece mucho más limpio implementar esto en el nivel de proc almacenado. –

Cuestiones relacionadas