2011-12-18 24 views
7

Mục tiêu là thay đổi chuỗi truy vấn trong một thủ tục được lưu trữ Mysql dựa trên các biến đầu vào.Mysql tự động tạo chuỗi truy vấn trong một thủ tục được lưu trữ dựa trên logic

Something như thế này:

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

Các giải pháp là sử dụng thực thi, và concat: CREATE DEFINER = 'root' @ 'localhost' PROCEDURE' test' (nhập VARCHAR (15)) BEGIN SET @input = input; nếu @ input = "asc" sau đó SET @sort = "order by ActivityLogKey asc"; elseif @input = "desc" rồi SET @sort = "order by ActivityLogKey desc"; else SET @sort = ""; kết thúc nếu; SET @query = CONCAT ('chọn * từ activitylog', @ sort, 'limit 0, 5'); NGAY LẬP TRƯỚC TỪ @query; EXECUTE stmt; DEPOCATE PREPARE stmt; END –

+0

Nếu đây là giải pháp tại sao bạn không thêm nó làm câu trả lời và chấp nhận câu trả lời hoặc chỉnh sửa câu hỏi của bạn. –

+0

Nếu không có 100 danh tiếng, tôi phải chờ 8 giờ để trả lời câu hỏi của riêng tôi –

Trả lời

13

Các giải pháp là sử dụng thực thi, và 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

Tính hữu ích mà tôi tìm thấy cho điều này là có thể chèn điều kiện tham gia, các trường hoặc bất kỳ mã SQL nào khác như một phần của proc được lưu trữ thay vì trong PHP. Dường như nó còn sạch hơn để thực hiện điều này ở cấp proc được lưu trữ. –

Các vấn đề liên quan