2016-09-29 6 views
0

여기에 'backstory'가 있습니다. mysql 저장 proc이 테이블 생성을 끝내고 proc의 끝에서 테이블을 파괴해야합니다. 내가이 일을하는 이유는 내가 proc이 실패하면 내가 만들고있는 "temp"테이블을 겹쳐서 쓰지 않게하기 위해서이다. (그들은 정말로 임시 테이블이 아니고 그냥 호출한다. 그것들은 내가 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'" 을 나는 다음 코드 조각을 주석 경우 다음 시저는

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

저장 프로 시저를 호출하는 방법을 보여주고 create proc 행을 표시하십시오. 물론 문자열을 실행하는 부분이기 때문에 제거하는 것이 좋습니다. 그리고 당신이 나를 고치기를 원한다는 것을 알기를 원한다면, "편집이 있습니다."... do [편집] – Drew

답변

0

나는 바보 바보 .. 그것을 알아 냈다. tableName이라는 var가 있고 delete 문에서 TableName이라는 열을 참조하고 있습니다. group_concat 문의 열에 tablename var를 전달 했으므로 실패한 것입니다.

관련 문제