반응형
커서 및 준비된 문장이 있는 절차:SQL 구문에 오류가 있습니다.EXECUTE stmt, DEALLOCATE PREAPE stmt, END L' 행이 34 입니다.
수술에 효과가 있는 방법이 있어요10.3.28-MariaDB
하지만, 에서 발견하기 어려운 문제가 있습니다.MySQL 5.7.26
이 절차에서는 모든 절차/기능을 수행하며, 일정 날짜 후에 변경되어 특정 사용자에게 실행 권한을 부여합니다.
CREATE PROCEDURE ExecuteGrantsForModifiedProcedures(IN p_schema varchar(120),
IN p_mysqlUser varchar(120),
IN p_fromModificationDate datetime)
BEGIN
DECLARE v_done INT DEFAULT FALSE;
DECLARE v_statement TEXT;
# Get all the modified procedures/functions
DECLARE cur1 CURSOR FOR SELECT CONCAT('GRANT EXECUTE ON PROCEDURE `', ROUTINE_SCHEMA, '`.`', routine_name, '` TO ',
p_mysqlUser, ';')
FROM information_schema.routines
where routine_schema = p_schema
AND ROUTINE_TYPE = 'PROCEDURE'
AND date(LAST_ALTERED) >= date(p_fromModificationDate)
UNION
SELECT CONCAT('GRANT EXECUTE ON FUNCTION `', ROUTINE_SCHEMA, '`.`', routine_name, '` TO ',
p_mysqlUser, ';')
FROM information_schema.routines
where routine_schema = p_schema
AND ROUTINE_TYPE = 'FUNCTION'
AND date(LAST_ALTERED) >= date(p_fromModificationDate);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;
SET max_sp_recursion_depth = 1024;
OPEN cur1;
read_loop:
LOOP
FETCH cur1 INTO v_statement;
IF v_done THEN
LEAVE read_loop;
END IF;
PREPARE stmt FROM v_statement;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE cur1;
end;
Procedure create 문을 실행하려고 하면 MySQL에 다음 오류가 나타납니다.
[1064] SQL 구문에 오류가 있습니다. 34행의 'v_statement; EXECUTE stmt; DEALLOCATE PREAPEMT; END L'에서 사용할 올바른 구문에 대해 MySQL Server 버전에 해당하는 설명서를 참조하십시오.
MySQL에서는 사용자 정의 변수만 사용할 수 있습니다.PREPARE
. 그래서 제거한다.v_statement
선언과 사용@v_statement
대신 모든 곳에서:
CREATE PROCEDURE ExecuteGrantsForModifiedProcedures(IN p_schema varchar(120),
IN p_mysqlUser varchar(120),
IN p_fromModificationDate datetime)
BEGIN
DECLARE v_done INT DEFAULT FALSE;
DECLARE v_statement TEXT;
# Get all the modified procedures/functions
DECLARE cur1 CURSOR FOR SELECT CONCAT('GRANT EXECUTE ON PROCEDURE `', ROUTINE_SCHEMA, '`.`', routine_name, '` TO ',
p_mysqlUser, ';')
FROM information_schema.routines
where routine_schema = p_schema
AND ROUTINE_TYPE = 'PROCEDURE'
AND date(LAST_ALTERED) >= date(p_fromModificationDate)
UNION
SELECT CONCAT('GRANT EXECUTE ON FUNCTION `', ROUTINE_SCHEMA, '`.`', routine_name, '` TO ',
p_mysqlUser, ';')
FROM information_schema.routines
where routine_schema = p_schema
AND ROUTINE_TYPE = 'FUNCTION'
AND date(LAST_ALTERED) >= date(p_fromModificationDate);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;
SET max_sp_recursion_depth = 1024;
OPEN cur1;
read_loop:
LOOP
FETCH cur1 INTO v_statement;
IF v_done THEN
LEAVE read_loop;
END IF;
SET @v_statement := v_statement;
PREPARE stmt FROM @v_statement;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE cur1;
end
언급URL : https://stackoverflow.com/questions/67294985/procedure-with-cursor-and-prepared-statement-problem-you-have-an-error-in-your
반응형
'programing' 카테고리의 다른 글
파일의 총 크기(바이트)를 가져옵니다. (0) | 2022.09.12 |
---|---|
pip과 conda의 차이점은 무엇입니까? (0) | 2022.09.12 |
MariaDB/MySQL에서 utf8mb4_unicode_ci와 utf8mb4_unicode_520_ci 조합의 차이는 무엇입니까? (0) | 2022.09.05 |
CSS: 의사 요소를 제거하는 방법(후, 전, ...?) (0) | 2022.09.05 |
Javascript에서 문자열을 N자로 트리밍하는 방법은? (0) | 2022.09.05 |