2010-11-23 132 views
3

你好,我试图在MySQL中自动执行我的历史记录过程。 该过程应更新表并使用uid作为名称创建另一个表。如何通过MySQL中的存储过程提交查询?

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变量的正确方法?

预先感谢您。 Arman。

回答

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()将它与字符串中的实际值进行汇编,因为它已经在该阶段已知。

有一个reasonable article about it here,在previous SO post中提到。

+0

谢谢!!!很好的解决方案... – Arman 2010-11-24 16:17:21