문제

조회 결과에서 모든 행을 가져 오는 방법을 찾고 개별적으로 프로세스하는 방법을 찾고 있습니다. 나는 내가 일할 것으로 생각했던 스크립트를 썼다.

스크립트 :

DECLARE @name char(20);

DECLARE c1 CURSOR READ_ONLY
FOR
SELECT table_name
FROM information_schema.tables WHERE table_schema = 'puslogger' AND UPDATE_TIME < (now() - interval 30 day)

OPEN c1; 

FETCH NEXT FROM c1
INTO @table_name

WHILE @@FETCH_STATUS = 0
BEGIN

PREPARE stmt FROM "concat('DROP TABLE IF EXISTS `', @table_name,'`;')"
EXECUTE stmt
DEALLOCTATE stmt

FETCH NEXT FROM c1
INTO @table_name

END

CLOSE c1
DEALLOCATE c1
.

스크립트는 30 일 이상의 모든 테이블을 삭제하기위한 것입니다. MySQL 버전 5.5.37에서 작동하지는 않지만

나는 MySQL을 처음 사용하고 Windows 용 MySQL (XP)으로 서버를 실행하고 있습니다. 아마도 커서에 대한이 구문이 해당 서버 버전에 맞지 않습니까? 나는 확실하지 않지만 누군가가 나를 도울 수 있다면 나는 매우 행복 할 것이다.

편집 :

SQL 명령 줄에서 스크립트를 실행하려고하면 반환 된 오류 메시지입니다.

오류 1064 (42000) : SQL 구문에 오류가 발생합니다.

라인 1에서 'Declare @name char (20)'근처에서 사용할 수있는 오른쪽 구문에 해당하는 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. 1

오류 1064 (42000) : SQL 구문에 오류가 발생합니다.

근처에 사용하려면 오른쪽 구문을 위해 MySQL 서버 버전에 해당하는 매뉴얼을 확인하십시오. 'C1 Cursor read_only를 선언하십시오 에 대한 table_name을 선택하십시오 information_schema.tables '라인 1 일

오류 1064 (42000) : SQL 구문에 오류가 발생했습니다. 가까운 구문을 위해 오른쪽 구문을 위해 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. '술책 다음 C1에서 @table_name

@@ fetch_status= 0입니다 시작

라인 1에서 ST '준비

업데이트 :

이 스크립트를 시도했습니다 (참고 : 나는 매일 30 일 이상의 테이블을 제거하기 위해 매일 실행될 이벤트를 만들려고합니다.) :

delimiter |

CREATE EVENT clean_logger
    ON SCHEDULE EVERY 1 DAY
    DO
    BEGIN
        DECLARE @name char(20);
    DECLARE c1 CURSOR READ_ONLY
    FOR
    SELECT table_name
    FROM information_schema.tables WHERE table_schema = 'puslogger' AND UPDATE_TIME < (now() - interval 30 day);

    OPEN c1; 

    FETCH NEXT FROM c1
    INTO @table_name;

    WHILE @@FETCH_STATUS = 0
    BEGIN

    PREPARE stmt FROM "concat('DROP TABLE IF EXISTS `', @table_name,'`;')";
    EXECUTE stmt;
    DEALLOCTATE stmt;

    FETCH NEXT FROM c1
    INTO @table_name;

    END;

CLOSE c1;
DEALLOCATE c1;
END |

delimiter ;
.

SQL 명령 행 에서이 스크립트를 실행하면 다음을 반환합니다.

오류 1064 (42000) : SQL 구문에 오류가 발생합니다.

근처에 사용하려면 오른쪽 구문을 위해 MySQL 서버 버전에 해당하는 매뉴얼을 확인하십시오. '@name char (20); C1 Cursor read_only를 선언하십시오 에 대한 table_name을 선택하십시오 infor '에서 5 선

도움이 되었습니까?

해결책

아래를 시도하십시오. 절차 :

DELIMITER $$

USE `test`$$

DROP PROCEDURE IF EXISTS `sp_drop_table`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_drop_table`()
BEGIN
        DECLARE done INT(1) DEFAULT 0;
        DECLARE _tblname VARCHAR(20) DEFAULT '';

        DECLARE cur1 CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_schema = 'puslogger' AND UPDATE_TIME < (NOW() - INTERVAL 30 DAY);
        DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
-- open cursor1
OPEN cur1;
BEGIN

REPEAT
FETCH cur1 INTO _tblname;
IF _tblname = '' THEN
    SET done = 1;
END IF; 

            IF (done<>1) THEN
    SET @str1=CONCAT("DROP TABLE IF EXISTS ",_tblname);
                 PREPARE stmt1 FROM @str1;
                 EXECUTE stmt1;
                 DEALLOCATE PREPARE stmt1;

            END IF;

UNTIL done
END REPEAT;
END;
     CLOSE cur1;
-- close cursor1     

     SELECT 'done';

END$$

DELIMITER ;
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top