您好,我正在尝试在 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 变量的正确方法是什么?
先谢谢你。 阿曼。
最佳答案
我认为解决这个问题的方法是使用动态 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() 将其与字符串中的实际值组装起来,因为它在该阶段已知。
有一个reasonable article about it here , 在 previous SO post 中提到.
关于stored-procedures - MySQL中如何通过存储过程提交查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4256318/