2016-09-29 5 views
0

ここに 'backstory'があります:私はmysqlストアドprocを持っていて、テーブルを作成して終了し、procの最後にテーブルを破壊するはずです。私がこれをやっているのは、私が作成しているこれらの "temp"テーブルを積み重ねることがないようにprocが失敗した場合(本当に一時テーブルではありませんが、それらは私がprocでやったときに削除されるはずだからです)。とにかく、私のprocの最初の20行は以下の通りです。mysql stored proc truncate table

-- build dynamic sql to drop any tables that have been around for longer than 30 seconds 

SELECT CONCAT('DROP TABLE IF EXISTS ',GROUP_CONCAT(TableName),';') 
INTO @dropcmd FROM TempTableTracker WHERE TIMESTAMPDIFF(SECOND, Created, NOW()) > 30; 

-- execute dynamic sql 
PREPARE dropcmd FROM @dropcmd; 
EXECUTE dropcmd; 
DEALLOCATE PREPARE dropcmd; 

DELETE FROM TempTableTracker WHERE TIMESTAMPDIFF(SECOND, Created, NOW()) > 30; 

SET @nextOutTable = concat('Insert into TempTableTracker (Created, TableName) values (NOW(),''',tableName,''')'); 
PREPARE nextOutTable FROM @nextOutTable; 
EXECUTE nextOutTable; 
DEALLOCATE PREPARE nextOutTable; 

procが現在 というエラー投げている「ではないユニークなテーブル/エイリアス: 『HelperTable088747200147510875390』」 私は次のコードをコメントアウトした場合、procは

PREPARE dropcmd FROM @dropcmd; 
EXECUTE dropcmd; 
DEALLOCATE PREPARE dropcmd; 
の作品

本当に私には分かりません。そのコードを実行して、私が「手作業」(プラスselect concatステートメント... procではない)をSQLエディタからコメントアウトすると、それも動作します。何がここで起こっているかもしれないかについての任意のアイデア?ここで

が全体procのです - >

DELIMITER ;; 
CREATE PROCEDURE "usergroupCalcs"(IN sqlstatement TEXT, IN tableName  VARCHAR(1000), IN topLevelParentID INT) 
BEGIN 

-- build dynamic sql (DROP TABLE tbl1, tbl2...;) 
SELECT CONCAT('DROP TABLE IF EXISTS ',GROUP_CONCAT(TableName),';') 
INTO @dropcmd FROM TempTableTracker WHERE TIMESTAMPDIFF(SECOND, Created, NOW()) > 30; 

-- execute dynamic sql 
PREPARE dropcmd FROM @dropcmd; 
EXECUTE dropcmd; 
DEALLOCATE PREPARE dropcmd; 

DELETE FROM TempTableTracker WHERE TIMESTAMPDIFF(SECOND, Created, NOW()) > 30; 

SET @nextOutTable = concat('Insert into TempTableTracker (Created, TableName)  values (NOW(),''',tableName,''')'); 
PREPARE nextOutTable FROM @nextOutTable; 
EXECUTE nextOutTable; 
DEALLOCATE PREPARE nextOutTable; 



SET @dropTable = concat('Drop table if exists ',tableName); 
PREPARE dropTable FROM @dropTable; 
EXECUTE dropTable; 
DEALLOCATE PREPARE dropTable; 



SET @createTable = concat('CREATE TABLE ',tableName,' (usergroupID INT, storeID INT, parentID INT, INDEX ug (`usergroupID`), INDEX st (`storeID`), INDEX pim (`parentID`)) ENGINE=MEMORY'); 
PREPARE createTable FROM @createTable; 
EXECUTE createTable; 
DEALLOCATE PREPARE createTable; 




SET @insertIntoTable = concat('INSERT INTO ',tableName, ' ',sqlstatement); 
PREPARE insertIntoTable FROM @insertIntoTable; 
EXECUTE insertIntoTable; 
DEALLOCATE PREPARE insertIntoTable; 


SET @repeatStatement = concat('DELETE entry.* FROM ',tableName,' entry LEFT JOIN ',tableName,' parent ON entry.parentID = parent.usergroupID AND entry.storeID = parent.storeID WHERE parent.usergroupID IS NULL AND entry.parentID NOT IN (',topLevelParentID,')'); 
PREPARE repeatStatement FROM @repeatStatement; 

    REPEAT 
    EXECUTE repeatStatement; 
    UNTIL row_count() = 0 END REPEAT; 

    DEALLOCATE PREPARE repeatStatement; 

SET @dropTempTable = concat('DROP TEMPORARY TABLE IF EXISTS ',tableName,'_out'); 
PREPARE dropTempTable FROM @dropTempTable; 
EXECUTE dropTempTable; 
DEALLOCATE PREPARE dropTempTable; 


SET @createTempTable = concat('CREATE TEMPORARY TABLE ',tableName,'_out (usergroupID INT, storeID INT, parentID INT, INDEX ug (`usergroupID`), INDEX st (`storeID`), INDEX pim (`parentID`)) ENGINE=MEMORY COLLATE ''utf8_general_ci'' as select * from ',tableName); 
PREPARE createTempTable FROM @createTempTable; 
EXECUTE createTempTable; 
DEALLOCATE PREPARE createTempTable; 


SET @dropTempTableTwo = concat('DROP TABLE IF EXISTS ',tableName); 
PREPARE dropTempTableTwo FROM @dropTempTableTwo; 
EXECUTE dropTempTableTwo; 
DEALLOCATE PREPARE dropTempTableTwo; 


END;; 
DELIMITER ; 
+0

なぜ「CREATE TEMPORARY TABLE」を使用していないのですか?それらは、データベース接続を閉じると自動的に削除されます。 – Barmar

+0

'DROP TABLE IF EXISTS'は、存在しないテーブルに対して警告を生成します。警告がエラーになっているようです。 – Barmar

+0

保存されたprocをどのように呼び出すかを示し、create proc行を表示します。もちろん、あなたが書き直したものは、それが文字列を実行する部分であるため、正常に動作します。 – Drew

答えて

0

私は愚かな愚かな...それを考え出しました。私はtableNameという名前のvarを持っていて、deleteステートメントのTableNameという名前の列も参照していました。それはgroup_concatステートメントの列にtablename varを渡して代入していたため、失敗したのです。

関連する問題