반응형
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
반응형
'programing' 카테고리의 다른 글
| 안전값은 DomSanitizer를 사용하여 우회 보안 후 [binding]=binding을 사용해야 합니다. (0) | 2023.09.07 |
|---|---|
| ORA-00906: 왼쪽 괄호 누락 (0) | 2023.09.07 |
| 파워셸의 비트와이즈 연산자 사용 (0) | 2023.09.07 |
| Excel에서 VBA를 사용하여 이중으로 잘라내기 (0) | 2023.09.07 |
| 에 Powershell v2.0을 내장하고 있습니다.Windows 8 RTM의 NET 앱 (0) | 2023.09.07 |