2010-02-17 85 views
1

我一直在嘗試使存儲過程自動刪除臨時表。使用存儲過程刪除臨時表

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 

但是,我得到的是:

查詢:撥打DeleteTemp 錯誤代碼:1051 未知表 'tmptablename'

我怎樣才能正確地傳遞變量tmptablename到「DROP TABLE 「命令?


使用預處理語句修復。

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 

回答

2

你吃過看看PREPAREEXECUTE命令。這就好比執行動態SQL

SQL Syntax for Prepared Statements

以下SQL語句可在準備的語句被用於 :ALTER TABLE,CALL,COMMIT,CREATE INDEX CREATE TABLE,DELETE,DO,DROP INDEX , DROP TABLE,INSERT,RENAME TABLE, REPLACE,SELECT,SET,UPDATE和大多數 SHOW語句。 ANALYZE TABLE, OPTIMIZE TABLE和REPAIR TABLE是從MySQL 5.0.23開始支持的 。

0

這可能不是你以後的樣子,但是你是否知道臨時表只對創建它們的連接可見,並且一旦連接關閉就會自動刪除?

+0

是的,我。我正在尋找一種方法來根據他們的名字刪除一堆公共表(如tmp *)。有時它有助於調試! – 2011-07-20 08:20:12