您好我正在尝试自动化MySQL中的历史跟踪程序。 该过程应更新表并使用uid作为名称创建另一个表。
CREATE PROCEDURE `InsertQueryStore`( u VARCHAR(128), ID INT, q VARCHAR(1024) )
BEGIN
INSERT INTO querystore(`qID`, `qstring`, `user`) VALUES(ID, q, u); # this works
# DROP TABLE IF EXIST ID ; //Can I do something like this?
# CREATE TABLE ID q; // The q is a query string which should return results into to table ID
END;
然后我想称之为:
Call InsertQueryStore("myname", 100, "select * from mydb.table limit 10")
在过程中使用varchar变量的正确方法是什么?
事先谢谢你。 阿尔曼。
答案 0 :(得分:1)
我认为采用的方法是使用动态SQL。
MySQL不像某些DBMS那样支持动态SQL,但它确实有PREPARE / EXECUTE方法来创建查询并执行它。看看您是否可以在存储过程中使用它们。
类似的东西:
CREATE PROCEDURE `InsertQueryStore`( u VARCHAR(128), ID INT, q VARCHAR(1024) )
BEGIN
INSERT INTO querystore(`qID`, `qstring`, `user`) VALUES(ID, q, u);
PREPARE stmt FROM "DROP TABLE IF EXIST ?";
EXECUTE stmt USING ID;
DEALLOCATE PREPARE stmt;
/* etc */
END;
如果您发现无法将参数化版本与'?'一起使用在这种情况下,只需使用CONCAT()将其与字符串中的实际值组合,就像在该阶段已知的那样。