programing

MariaDB 구문 오류를 확인하는 방법(Error Code 1064)?

newnotes 2023. 9. 7. 22:01
반응형

MariaDB 구문 오류를 확인하는 방법(Error Code 1064)?

저는 테이블에서 자동으로 데이터를 정리하기 위해 MariaDB 10에 2개의 간단한 저장 프로시저를 가지고 있습니다.첫 번째 표는 간단한 표에서 구성 항목을 읽고 해당 데이터를 두 번째 표로 전달하여 물리적으로 기록을 삭제합니다.테스트하는 동안에는 모두 정상적으로 작동했지만, 지금은 "Error Code: 1064"라는 오류가 나타납니다. SQL 구문에 오류가 있습니다. MariaDB 서버 버전에 해당하는 매뉴얼에서 10,052초"의 'NULL' 근처에서 사용할 수 있는 올바른 구문을 확인하십시오. 이유를 모르겠습니다.

절차는 다음과 같습니다.

CREATE DEFINER=`root`@`10.135.15.%` PROCEDURE `clean_table_checker`()
BEGIN
    DECLARE TMP_TIME_AGO INT(11);
    DECLARE TMP_ID INT(11);
    DECLARE TMP_RETENTION_SECS INT(11);
    DECLARE TMP_DBNAME VARCHAR(45);
    DECLARE TMP_TABLENAME VARCHAR(45);
    DECLARE TMP_TS_FIELD VARCHAR(45);
    DECLARE TMP_LASTUPDATE INT(11);
    DECLARE TMP_RETENTION INT(4);
    DECLARE DONE INT DEFAULT 0;
    DECLARE get_tables CURSOR FOR SELECT `id`, `dbname`, `tablename`, `ts_field`, `lastupdate`, `retention` FROM management.clean_table;    

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
        
    OPEN get_tables;
    
    loop_cursor_ptr: LOOP
        IF DONE THEN
            LEAVE loop_cursor_ptr;
        END IF;

        FETCH get_tables INTO TMP_ID, TMP_DBNAME, TMP_TABLENAME, TMP_TS_FIELD, TMP_LASTUPDATE, TMP_RETENTION;
        SET TMP_TIME_AGO = UNIX_TIMESTAMP(NOW()) - TMP_LASTUPDATE;
        SET TMP_RETENTION_SECS = TMP_RETENTION * 86400;

        IF TMP_LASTUPDATE is NULL THEN
            SET @SQL = CONCAT('UPDATE management.clean_table SET `lastupdate`=',UNIX_TIMESTAMP(NOW()),' WHERE `id`=',TMP_ID,';');
        ELSEIF (TMP_TIME_AGO > TMP_RETENTION_SECS) THEN
            CALL clean_table_proc(TMP_DBNAME, TMP_TABLENAME, TMP_TS_FIELD, TMP_RETENTION_SECS);
            SET @SQL = CONCAT('UPDATE management.clean_table SET `lastupdate`=',UNIX_TIMESTAMP(NOW()),' WHERE `id`=',TMP_ID,';');
        END IF;
        PREPARE STMT FROM @SQL;
        EXECUTE STMT;
        DEALLOCATE PREPARE STMT;


    END LOOP loop_cursor_ptr;

    CLOSE get_tables;
END

무슨 생각 있어요?제안?

만약 당신의 조건이 둘 다 아니라면)TMP_LASTUPDATE is NULL,TMP_TIME_AGO > TMP_RETENTION_SECS)의 값이 참입니다.@SQL설정되지 않았으므로NULL. 그러면 당신은 a로부터 문장을 준비하려고 하는 것입니다.NULLvalue, 이것이 당신이 현재의 오류를 보는 이유입니다.다음과 같이 쿼리 실행이 필요한지 여부에 대한 테스트를 추가해야 합니다.

SET @SQL = ''
IF TMP_LASTUPDATE is NULL THEN
    SET @SQL = CONCAT('UPDATE management.clean_table SET `lastupdate`=',UNIX_TIMESTAMP(NOW()),' WHERE `id`=',TMP_ID,';');
ELSEIF (TMP_TIME_AGO > TMP_RETENTION_SECS) THEN
    CALL clean_table_proc(TMP_DBNAME, TMP_TABLENAME, TMP_TS_FIELD, TMP_RETENTION_SECS);
    SET @SQL = CONCAT('UPDATE management.clean_table SET `lastupdate`=',UNIX_TIMESTAMP(NOW()),' WHERE `id`=',TMP_ID,';');
END IF;
IF @SQL != '' THEN
    PREPARE STMT FROM @SQL;
    EXECUTE STMT;
    DEALLOCATE PREPARE STMT;
END IF;

언급URL : https://stackoverflow.com/questions/66275984/how-to-check-a-mariadb-syntax-error-error-code-1064

반응형