2011-05-05 131 views
3

我有这样的SQL文件PREPARE语句:当我尝试用MySQL的存储过程

#猫file.sql运行

USE mydb; 

DROP PROCEDURE IF EXISTS execSql; 
DELIMITER // 
CREATE PROCEDURE execSql (
        IN sqlq VARCHAR(5000) 
        ) COMMENT 'Executes the statement' 
BEGIN 
    PREPARE stmt FROM sqlq; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END // 
DELIMITER ;   

| MySQL的-p

我得到

ERROR 1064 (42000) at line 6: You have an error in your SQL syntax; check the manual 
that corresponds to your MySQL server version for the right syntax to use near 'sqlq; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
    END' at line 5 

我在做什么错?

回答

14

您只能准备并执行sql的字符串文字或用户变量,其中包含语句的文本。尝试

USE mydb; 

DROP PROCEDURE IF EXISTS execSql; 
DELIMITER // 
CREATE PROCEDURE execSql (
       IN sqlq VARCHAR(5000) 
       ) COMMENT 'Executes the statement' 
BEGIN 
    SET @sqlv=sqlq; 
    PREPARE stmt FROM @sqlv; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END // 
DELIMITER ;  
0

可以使用串联,编制和执行语句作为波纹管..

CREATE DEFINER=`products`@`localhost` PROCEDURE `generateMeritList`(
    IN `mastercategory_id` INT(11), 
    IN `masterschools_id` INT(11) 
) 
NO SQL 
begin 

    declare total int default 0; 
    declare conditions varchar(255) default ''; 
    declare finalQuery varchar(60000) default ''; 

if mastercategory_id > 0 THEN 
    SET conditions = CONCAT(' and app.masterschools_id = ', mastercategory_id); 
end if; 

SET @finalQuery = CONCAT(
"SELECT * FROM applications app INNER JOIN masterschools school ON school.id = app.masterschools_id 
WHERE 
(app.status = 'active'", conditions, " LIMIT ",total); 

PREPARE stmt FROM @finalQuery; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

end 
+1

谢谢你的努力,但是,除了事实上,我已经接受了大约5年前强积金的答案,我不了解你的帖子应该如何回答我的问题。 – 2016-05-07 17:31:44