2011-12-18 8 views
7

Celem jest zmiana ciągu zapytania w procedurze przechowywanej Mysql na podstawie zmiennych wejściowych.Mysql dynamicznie buduje ciąg zapytania w procedurze przechowywanej opartej na logice

coś takiego:

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

Rozwiązaniem jest użycie wykonać i concat: TWORZENIE Definer = 'root' @ 'localhost' PROCEDURE' test' (wejście VARCHAR (15)) BEGIN BEGIN BEGIN BEGIN SET @input = input; if @ input = "asc" następnie SET @sort = "order by ActivityLogKey asc"; elseif @input = "desc" następnie SET @sort = "order by ActivityLogKey desc"; else SET @sort = ""; koniec if; SET @query = CONCAT ("wybierz * z rejestru aktywności", @ sortuj, "limit 0, 5"); PREPARE stmt FROM @query; WYKONAJ ZASADNICĘ; WYKORZYSTUJESZ DEALOKACJĘ stp; END –

+0

Jeśli to jest rozwiązanie, dlaczego nie dodałeś go jako odpowiedzi i zaakceptuj lub edytuj swoje pytanie za pomocą tego. –

+0

Bez 100 reputacji, muszę poczekać 8 godzin, aby odpowiedzieć na moje własne pytanie. –

Odpowiedz

13

Rozwiązaniem jest użycie wykonać i 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

Przydatność, jaką znalazłem w tym celu, to możliwość warunkowego wstawiania sprzężeń, pól lub dowolnego innego kodu SQL jako części przechowywanego procesu, a nie w PHP. Wydaje się, że wdrożenie tego na poziomie przechowywanym jest znacznie łatwiejsze. –