Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

돌맹이

mariadb cursor를 불러오지 못하는 현상 본문

programming/DB

mariadb cursor를 불러오지 못하는 현상

오택 2024. 7. 15. 16:41

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