2010-02-17 5 views
1

J'ai essayé de créer une procédure stockée qui autodélèterait des tables temporaires.Suppression de tables temporaires avec une procédure stockée

CREATE PROCEDURE DeleteTemp() 
BEGIN 
DECLARE no_more_rows BOOLEAN; 
DECLARE loop_cntr INT DEFAULT 0; 
DECLARE num_rows INT DEFAULT 0; 


DECLARE tmptablename VARCHAR(100); 
DECLARE tmpTables CURSOR FOR 
    SELECT TABLE_NAME 
    FROM information_schema.TABLES 
    WHERE TABLE_SCHEMA='myDB' AND TABLE_NAME LIKE 'tmp%'; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE; 
OPEN tmpTables; 
SELECT FOUND_ROWS() into num_rows; 
the_loop: LOOP 
    FETCH tmpTables INTO tmptablename; 
    DROP TABLE tmptablename; 
    IF no_more_rows THEN 
     CLOSE tmpTables; 
     LEAVE the_loop; 
    END IF; 
END LOOP the_loop; 
END 

Cependant, tout ce que je reçois est:

Requête: appel DeleteTemp Code d'erreur: 1051 une table inconnue 'tmptablename'

Comment puis-je passer la tmptablename variables correctement dans le « DROP TABLE "commande?


fixe à l'aide d'instructions préparées.

CREATE 
    PROCEDURE DeleteTemp() 
    BEGIN 
    DECLARE no_more_rows BOOLEAN; 
    DECLARE loop_cntr INT DEFAULT 0; 
    DECLARE num_rows INT DEFAULT 0; 


    DECLARE tmptablename VARCHAR(100); 
    DECLARE tmpTables CURSOR FOR 
     SELECT TABLE_NAME 
     FROM information_schema.TABLES 
     WHERE TABLE_SCHEMA='MY_SCHEMA' 
      AND TABLE_NAME LIKE 'tmp%'; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE; 
    OPEN tmpTables; 
    SELECT FOUND_ROWS() INTO num_rows; 

    the_loop: LOOP 
     FETCH tmpTables INTO tmptablename; 
     IF no_more_rows THEN 
      CLOSE tmpTables; 
      LEAVE the_loop; 
     ELSE 
      SET @a:=CONCAT('DROP TABLE ',tmptablename); 
      PREPARE stmt1 FROM @a; 
      EXECUTE stmt1; 
      DEALLOCATE PREPARE stmt1; 
     END IF; 
    END LOOP the_loop; 
    END 

Répondre

2

Avez-vous eu un coup d'œil à la PRÉPARER et EXECUTE commandes. C'est comme l'exécution SQL dynamique

SQL Syntax for Prepared Statements

Les instructions SQL suivantes peuvent être utilisés dans les instructions préparées: ALTER TABLE, APPEL, COMMIT, CREATE INDEX, CREATE TABLE, DELETE, NE, DROP INDEX , DROP TABLE, INSERT, TABLE RENAME, REPLACE, SELECT, SET, UPDATE et la plupart des instructions SHOW . ANALYZE TABLE, OPTIMIZE TABLE, et REPAIR TABLE sont également pris en charge à partir de MySQL 5.0.23.

0

Cela peut ne pas être ce que vous recherchez, mais savez-vous que vos tables temporaires ne sont visibles à cette connexion qui les a créés et sont automatiquement supprimés une fois que la connexion est fermée?

+0

Oui, je le suis. Je cherchais un moyen de supprimer un tas de tables publiques en fonction de leur nom (comme tmp *). Cela aide parfois au débogage! –

Questions connexes