2013-05-15 7 views
2

사용자 변수에 설정된 테이블 이름에서 LOAD DATA INFILE을 사용할 수 있습니까?동적 테이블 이름 & LOAD DATA INFILE

ERROR 1295 (HY000): This command is not supported in the prepared statement protocol yet 

ERROR 1243 (HY000): Unknown prepared statement handler (stmt) given to EXECUTE 

ERROR 1243 (HY000): Unknown prepared statement handler (stmt) given to DEALLOCATE PREPARE 

, 그렇게하는 것이 불가능 내가 읽을 수있는, 경우, 당신이 할 : 여기

INSERT INTO Demand (name, comment, scale) VALUES (A,A,1); 
SET @Demand_id = LAST_INSERT_ID(); 

INSERT INTO Matrices (name, comment, total) VALUES (Matrix_0_1); 
SET @Matrices_last_id = LAST_INSERT_ID(); 
    INSERT INTO DemandSegment (usertype, Matrix, scale) SELECT 1, id, 2 FROM Matrices WHERE id = @matrice_last_id; 
    SET @DemandSegment_last_id = LAST_INSERT_ID(); 
    INSERT INTO Demand_DemandSegment (Demand_id, DemandSegment_id) VALUES(@Demand_id, @DemandSegment_last_id); 

    SET @matrix_creation = CONCAT("CREATE TABLE Matrix_",@matrices_last_id," LIKE Matrix_2"); 
    PREPARE stmt from @matrix_creation; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 

    SET @matrix_insertion = CONCAT("LOAD DATA INFILE '0.csv' INTO TABLE Matrix_",@Matrices_last_id); 
    PREPARE stmt from @matrix_insertion; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 

은 내가 오류입니다 : 여기

이 작동하지 않는 스크립트입니다 어떤 대안을 보시겠습니까?

+0

아마도 http://stackoverflow.com/questions/190776/how-to-have-dynamic-sql-in-mysql-stored-procedure와 관련이 있습니다. –

답변

-1

대체 방법 중 하나는 임시 테이블에 LOAD DATA를 입력 한 다음 임시 테이블을 실제 테이블에 복사하는 것입니다.

CREATE TEMPORARY TABLE Matrix_temp LIKE Matrix_2; 
LOAD DATA INFILE '0.csv' INTO TABLE Matrix_temp; -- not a prepared statement 

SET @matrix_creation = CONCAT('CREATE TABLE Matrix_',@matrices_last_id, 
' LIKE Matrix_2'); 
PREPARE stmt from @matrix_creation; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SET @matrix_insertion = CONCAT('INSERT INTO Matrix_',@Matrices_last_id, 
' SELECT * FROM Matrix_temp'); 
PREPARE stmt from @matrix_insertion; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

당신은 또한 복제를 사용하는 경우이 방법으로 임시 테이블을 사용의 위험에주의. 슬레이브가 다시 시작되면 임시 테이블이 손실됩니다. 임시 테이블을 채우고 영구 테이블에 복사하는 사이에 이런 일이 발생하면 복제를 중단 할 수 있습니다.

그런 일은 결코 일어나지 않을 것 같지만, 이것은 꽤 일반적입니다.
참조 : http://dev.mysql.com/doc/refman/5.6/en/replication-features-temptables.html