MySQL 커서에서 NOT FOUND 핸들러가 필요한 이유
MySQL에서 커서(cursor)를 사용해 저장 프로시저를 작성할 때는 반드시 NOT FOUND 핸들러를 함께 선언해야 합니다. 그 이유는 커서가 결과 집합(result set)에서 더 이상 가져올 행(row)을 찾지 못하는 상황을 처리하기 위해서입니다.
커서는 FETCH 문이 실행될 때마다 결과 집합에서 다음 행을 하나씩 읽어 옵니다. 그런데 마지막 행까지 모두 읽은 후 다시 FETCH를 호출하면 더 이상 가져올 행이 없으므로, MySQL은 '02000'(No data) SQLSTATE 경고를 발생시킵니다. 이 시점에 NOT FOUND 핸들러가 선언되어 있지 않으면 프로시저가 비정상적으로 동작하거나 무한 루프에 빠질 위험이 있습니다.
NOT FOUND 핸들러 선언 문법
DECLARE CONTINUE HANDLER FOR NOT FOUND SET var_name = value;- var_name: 값을 저장할 변수의 이름
- value: 해당 변수에 할당할 값
선언 예제
DECLARE CONTINUE HANDLER FOR NOT FOUND SET err = 1;위 예제에서는 더 이상 읽을 행이 없으면 변수 err에 1이 할당됩니다. 이후 REPEAT나 WHILE 같은 반복문 안에서 이 변수의 값을 조건으로 검사하면, 커서가 결과 집합의 끝에 도달했을 때 루프를 깔끔하게 종료할 수 있습니다.
CONTINUE 핸들러의 동작 방식
CONTINUE HANDLER는 NOT FOUND 조건이 발생했을 때 프로시저 실행을 중단하지 않고, 핸들러 본문을 실행한 뒤 현재 블록의 다음 문장부터 계속 진행합니다. 이러한 특성 덕분에 변수 값으로 루프 종료 여부를 판단하는 일반적인 커서 처리 패턴과 자연스럽게 어울리며, 안정적인 데이터 조회 로직을 구현할 수 있습니다.