2014-02-17 3 views
1

모든 테이블을 삭제하는 스크립트가 있습니다.저장 프로 시저에서 var가 NULL인지 확인합니다.

SET FOREIGN_KEY_CHECKS = 0; 
SET @tables = NULL; 

SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @tables 
    FROM information_schema.tables 
    WHERE table_schema = 'mydb'; 

SET @tables = CONCAT('DROP TABLE ', @tables); 
PREPARE stmt FROM @tables; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SET FOREIGN_KEY_CHECKS = 1; 

하나 이상의 테이블이 존재할 때 완벽하게 작동합니다. 두 번째 실행은 나에게 오류가 있습니다 : 나는 IF 문 사용하려고

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL' at line 1 SQL.sql 9 1

을,하지만 여전히 작동하지 않습니다

IF @tables IS NOT NULL THEN 
    SET @tables = CONCAT('DROP TABLE ', @tables); 
    PREPARE stmt FROM @tables; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END IF; 

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'if @tables IS NOT NULL THEN SET @tables = CONCAT('DROP TABLE ', @tables)' at line 1 SQL.sql 8 1

가있는 경우에 사용하는 올바른 방법은 무엇입니까 이 경우?

답변

2

세션 변수에 값을 할당하고 쿼리에서이 값을 사용하면
값이 자리 표시자를 대체합니다. 그리고 인해 이유로,

SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @tables 

는 전혀 의미가 없다

SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO NULL 

된다.

대신 값을 미리 설정하지 않고 직접 변수를 사용해야합니다.
그래서 그 범위가 블록에 정의되지 않는 한

SET @tables = NULL; 

그리고 두 번째는, 문 블록이 데이터베이스 엔진에서 직접 컴파일 할 수없는 사용하지 마십시오. 이것은 대개 저장 프로 시저 또는 트리거를 사용하여 수행됩니다. 프로 시저 내에있는 경우 BEGINEND 사이 여야합니다.

그래서 다음은 잘못된 것입니다 :

IF @tables IS NOT NULL THEN 
    SET @tables = CONCAT('DROP TABLE ', @tables); 
    PREPARE stmt FROM @tables; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END IF; 

당신은 범위 변수를 사용하는 저장 프로 시저에 대해 정의 된 구문을 따라야합니다. 아래에 언급 된

는 비슷한 질문에 대한 내 대답을 참조하십시오 : Variables declaration and scope :
  1. MySQL Syntax error.
  2. 또한 참조하십시오.
관련 문제