돌맹이
mariadb cursor를 불러오지 못하는 현상 본문
mariadb에서 프로시저를 실행할 때, cursor를 불러오지 못하는 현상 때문에 매우매우 골치아팠음.
프로시저 내 변수명을 table명과 다르게 지정해주면 해결.
/** 이전 코드 예시 **/
DELIMITER $$
DROP PROCEDURE IF EXISTS dropAll $$
CREATE PROCEDURE dropAll()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE constraint_name VARCHAR(64);
DECLARE table_name CHAR(64);
DECLARE cur1 CURSOR FOR select CONSTRAINT_NAME, TABLE_NAME from information_schema.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='FOREIGN KEY';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO constraint_name, table_name;
IF done THEN
LEAVE read_loop;
END IF;
select table_name, constraint_name;
END LOOP;
CLOSE cur1;
END$$
call dropAll()$$
DELIMITER ;
/** 이후 코드 예시 **/
DELIMITER $$
DROP PROCEDURE IF EXISTS dropAll $$
CREATE PROCEDURE dropAll()
BEGIN
DECLARE v_done INT DEFAULT FALSE;
DECLARE v_constraint_name VARCHAR(64);
DECLARE v_table_name CHAR(64);
DECLARE cur1 CURSOR FOR select CONSTRAINT_NAME, TABLE_NAME from information_schema.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='FOREIGN KEY';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO v_constraint_name, v_table_name;
IF v_done THEN
LEAVE read_loop;
END IF;
select v_table_name, v_constraint_name;
END LOOP;
CLOSE cur1;
END$$
call dropAll()$$
DELIMITER ;
두 코드의 차이점은 변수를 선언할 때, 앞에 v_ 를 붙였다는 점 뿐!
아무래도 프로시저의 변수명과 커서 내의 변수명이 같으면 불러오는데 오류가 있는것으로 보인다.
출처
https://stackoverflow.com/questions/24161460/using-cursor-with-information-schema
'programming > DB' 카테고리의 다른 글
[ORACLE] ASM TABLESPACE datafile 추가 (0) | 2023.10.25 |
---|---|
[DB, Oracle] 대용량 csv를 import할 때 데이터가 누락되는 현상 (0) | 2023.08.17 |