2010-11-23 4 views
3

Bonjour, J'essaie d'automatiser ma procédure de suivi de l'historique dans MySQL. La procédure doit mettre à jour une table et en créer une autre en utilisant uid comme nom.Comment soumettre la requête par procédure stockée dans 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; 

je voudrais appeler comme:

Call InsertQueryStore("myname", 100, "select * from mydb.table limit 10") 

Quelle est la bonne façon d'utiliser la variable varchar dans la procédure?

Merci d'avance. Arman.

Répondre

1

Je pense que la façon d'y aller serait d'utiliser Dynamic SQL. MySQL ne prend pas en charge le SQL dynamique de la même manière que certains SGBD, mais il dispose des méthodes PREPARE/EXECUTE pour créer une requête et l'exécuter. Voyez si vous pouvez les utiliser dans votre procédure stockée.

Quelque chose comme:

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; 

Si vous trouvez que vous ne pouvez pas utiliser la version avec paramétrées '? dans ce contexte, il suffit d'utiliser CONCAT() pour l'assembler avec la valeur réelle de la chaîne telle qu'elle est déjà connue à ce stade. Il y a un reasonable article about it here, mentionné dans un previous SO post.

+0

Merci! Belle solution ... – Arman

+0

@Arman Très bien, je travaille beaucoup dans SQL Server et MySQL. SQL dynamique est très souvent trouvé dans les procédures stockées dans SQL Server, mais pas tellement dans MySQL. Que ce soit une approche sensée ou non est une question d'opinion. ;-) – Orbling

+0

J'aime appeler de * .cs les procédures stockées gentilles. a récemment commencé à porter le web sur LAMP, j'ai juste besoin de changer le dialecte sql. Je me demandais pourquoi les gens de mysql n'aiment pas pousser certaines fonctions vers MySQL, peut-être que phpmyadmin ne les montre pas :). – Arman