2013-08-24 33 views
0

我有一个存储过程,它根据'foo'的值选择IDvars并为它们指定包含foo的变量名。我能做到这一点有:最小化MySQL存储过程中的参数

CALL db0.genericStoredProc(IDvar, "foo", "'foo'"); 

理想情况下,我只想写

CALL db0.genericStoredProc(IDvar, "foo"); 

如何利用吧,这样我不需要BAR2参数? 这里是我的存储过程的相关部分。

DROP PROCEDURE IF EXISTS genericStoredProc; 
DELIMITER $ $ 
CREATE PROCEDURE genericStoredProc(myID BIGINT(20) UNSIGNED, bar VARCHAR(5), bar2 VARCHAR(5)) 
BEGIN 
SET @s = CONCAT('SELECT gt.name, gt.junk, gt.junkName, count(gt.idvar) as id_count, 
     SUM(CASE 
      WHEN ot.offset <0 THEN 1 
      ELSE 0 
     END) AS ', bar,'_id_count 
    FROM genericTable gt 
     LEFT JOIN otherTable ot ON gt.IDvar2 = ot.IDvar 
    WHERE (gt.idvar = ', IDvar, ') AND (ot.prmtr = ', bar2, ') 
GROUP BY gt.idvar'); 

PREPARE stmt FROM @s; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
END $$ 
DELIMITER ; 

回答

1

使用局部变量
像下面

DELIMITER $ $ 
CREATE PROCEDURE genericStoredProc(myID BIGINT(20) UNSIGNED, bar VARCHAR(5)) 
BEGIN 
DECLARE bar2 VARCHAR(5); 
SET bar2=bar1 ; 
+0

我仍然有一些问题。这意味着我的真正问题是在where子句中将foo识别为“foo”。查询:CALL genericStoredProc(IDvar, “富”) 错误代码:1054 未知列 '富' 在 'where子句' 执行时间:0秒 转换时间:0秒 总时间:3.916秒 – Ben

+1

代替(myID BIGINT(20)UNSIGNED,bar VARCHAR(5))use(IN myID BIGINT(20)UNSIGNED,IN bar VARCHAR(5)) –