* 프로시저 기본적인 사용방법
CREATE PROCEDURE 프로시저명(
변수명 VARCHAR(10) -- 프로시저 실행 시 전달 받을 파라미터
)
BEGIN
DECLARE DONE INT DEFAULT FALSE; -- 커서의 쿼리 실행 시 마지막인지 체크하기 위한 변수
DECLARE 변수명 VARCHAR(10); -- 프로시저 내에 사용할 변수 선언
DECLARE 커서변수명 CURSOR FOR
SELECT 변수명
FROM 테이블; -- 커서 내에 실행할 쿼리문 작성
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET DONE = TRUE; -- 커서 내의 쿼리문 실행 한 후 데이터가 없을 경우 마지막 로우임을 표시하기 위해 TRUE값 저장
OPEN 커서변수명; -- 커서를 오픈한다.
CUR_LOOP : LOOP -- loop문 실행
FETCH 커서변수명 INTO 변수명; -- 쿼리 실행 후 결과값 저장
IF DONE THEN
LEAVE CUR_LOOP;
END IF; -- 쿼리 결과 값이 마지막 로우이면 loop문 빠져나감
SET 변수명 = 저장할 값; -- FETCH 실행 후 loop문 동안 변수에 저장할 값 저장
END LOOP;
CLOSE 커서변수명; -- 커서를 닫는다.
SELECT 변수명
FROM 테이블명; -- 출력할 쿼리문 작성
END;
- 프로시저에서 DELIMITER $$ 사용 이유
- 프로시저 내에 문장의 끝을 나타내는 세미콜로(;)을 사용하기 때문에 이를 구분하기 위해 "DELIMITER $$"을 이용하여 시작과 끝을 구분
- 사용법 : DELIMITER $$ ~ DELIMITER ;
- 프로시저에만 사용되는 것은 아님
- 참고 : https://devonce.tistory.com/27 - DECLARE : 프로시저 내에서 변수 선언 시 사용
- DECLARE 변수명 INT DEFAULT FALSE;
1) boolean 변수 선언 시 int 로 선언하는 이유(추측) :
- mysql에서 boolean 값은 tinyint(1) 형태로 저장 됨.
- 쿼리문 : SELECT true, false, TRUE, FALSE, True, False; 실행 결과 : 1 0 1 0 1 0 => 즉, if 문에서 0은 false로 인식. 0이 아닌 정수는 true로 인식(1,2..→ true)
- where 조건에서 boolean 값 비교 시 "컬럼 = true" 가 아닌 "컬럼 IS TRUE" 와 같이 비교해야 정확한 값을 가져올 수 있다.
- 참고 : https://www.mysqltutorial.org/mysql-boolean/
2) tinyint(1) VS int(1)
- 저장되는 byte와 입력범위가 다르다.
- tinyint : 1 byte, -128 to 127 signed, 0 to 255 unsigned
- int : 4 bytes, -2147483648 to 2147483647 signed, 0 to 4294967295 unsigned
- tinyint 나 int 다음에 나오는 괄호 안의 숫자는 화면에 표시하기 위한 숫자이고 실제 저장되는 값은 다르다.
- 참고 : https://stackoverflow.com/questions/8045327/is-there-a-difference-in-using-int1-vs-tinyint1-in-mysql - CURSOR : 실행할 쿼리를 담기 위해 사용
- DECLARE 변수를 선언한 다음에 사용. CURSOR를 먼저 실행할 경우 에러 발생. -
DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = TRUE;
- 에러를 잡기 위해 사용
- CONTINUE : 에러발생 후 현재 코드 단락을 계속 실행.
- NOT FOUND : 더이상 가져올 데이터가 없을때 발생.
- 참고 : https://blog.duveen.me/23 - OPEN : 커서를 연다.
- 선언한 커서를 오픈. OPEN 커서변수명; - LOOP : loop 문 실행
- FETCH : 커서의 쿼리문을 실행시킨다
-
IF DONE THEN
LEAVE CUR_LOOP;
END IF;
- 마지막 로우일 경우 loop 문을 빠져나간다. - CLOSE : 커서를 닫는다.
- 선언한 커서를 닫음. CLOSE 커서변수명; - TEMPORARY TABLE
- 테이블의 결과 값을 저장하기 위한 임시테이블.
- CREATE TEMPORARY TABLE 임시테이블명, DROP TEMPORARY TABLE 테이블명을 통해 임시테이블을 생성하거나 삭제 할 수 있음
- 임시테이블은 생성 전 해당 테이블이 있는지 확인할 필요가 있음. DROP TEMPORARY TABLE IF EXISTS 임시테이블명;
- 임시테이블 명은 같은 Session 내에서 중복 사용 불가
- 임시테이블은 Single Session 내에서 유지하다가 Session 이 끊기면 자동으로 삭제된다.
- 참고 : https://www.mysqltutorial.org/mysql-temporary-table/