본문 바로가기

카테고리 없음

mysql 프로시저

* 프로시저 기본적인 사용방법

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;
  • 참고 : https://bizadmin.tistory.com/entry/MySQL-Fetch-Cursor-%EB%AC%B8-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95

    1. 프로시저에서 DELIMITER $$ 사용 이유
      - 프로시저 내에 문장의 끝을 나타내는 세미콜로(;)을 사용하기 때문에 이를 구분하기 위해 "DELIMITER $$"을 이용하여 시작과 끝을 구분
      - 사용법 : DELIMITER $$ ~ DELIMITER ; 
      - 프로시저에만 사용되는 것은 아님
      - 참고 : https://devonce.tistory.com/27

    2. 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

    3. CURSOR : 실행할 쿼리를 담기 위해 사용
      - DECLARE 변수를 선언한 다음에 사용. CURSOR를 먼저 실행할 경우 에러 발생.

    4. DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = TRUE;
      - 에러를 잡기 위해 사용
      - CONTINUE : 에러발생 후 현재 코드 단락을 계속 실행.
      - NOT FOUND : 더이상 가져올 데이터가 없을때 발생.
      - 참고 : https://blog.duveen.me/23

    5. OPEN : 커서를 연다.
      - 선언한 커서를 오픈. OPEN 커서변수명;

    6. LOOP : loop 문 실행 

    7. FETCH : 커서의 쿼리문을 실행시킨다

    8. IF DONE THEN 
          LEAVE CUR_LOOP;
      END IF;
      - 마지막 로우일 경우 loop 문을 빠져나간다.

    9. CLOSE : 커서를 닫는다.
      - 선언한 커서를 닫음. CLOSE 커서변수명;

    10. TEMPORARY TABLE
      - 테이블의 결과 값을 저장하기 위한 임시테이블.
      - CREATE TEMPORARY TABLE 임시테이블명, DROP TEMPORARY TABLE 테이블명을 통해 임시테이블을 생성하거나 삭제 할 수 있음
      - 임시테이블은 생성 전 해당 테이블이 있는지 확인할 필요가 있음. DROP TEMPORARY TABLE IF EXISTS 임시테이블명;
      - 임시테이블 명은 같은 Session 내에서 중복 사용 불가
      - 임시테이블은 Single Session 내에서 유지하다가 Session 이 끊기면 자동으로 삭제된다.
      - 참고 : https://www.mysqltutorial.org/mysql-temporary-table/