블로그는 나의 힘!
[ Programing ]/Database2023. 5. 9. 16:01

DECLARE EXIT HANDLER FOR SQLEXCEPTION : 예외 처리.
DECLARE EXIT HANDLER FOR SQLWARNING : 경고 처리.




DELIMITER $$
CREATE PROCEDURE sp_procedure_ex( IN vDoc VARCHAR(13), IN vSequenceID VARCHAR(256) )
BEGIN
     DECLARE iResult INT DEFAULT(0);
     DECLARE iSQLDoc VARCHAR(13);

     -- 쿼리 예외처리 오류 시 해당 처리
     DECLARE EXIT HANDLER FOR SQLEXCEPTION
     BEGIN
          GET DIAGNOSTICS CONDITION 1
          @p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
          -- 오류 상태, 오류 메시지.
          SELECT @p1 AS RETURNED_SQLSTATE, @p2 as MESSAGE_TEXT;

          ROLLBACK;     -- TRANSACTION 종료 되지 않는 부분 종료 처리 (Unlock)
     END; 

     -- 쿼리 경고 생기면 해당 처리
     DECLARE EXIT HANDLER FOR SQLWARNING 
     BEGIN
          GET DIAGNOSTICS CONDITION 1
          @p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
          -- 경고 상태, 경고 메시지.
          SELECT @p1 AS RETURNED_SQLSTATE, @p2 as MESSAGE_TEXT;

          ROLLBACK;      -- TRANSACTION 종료 되지 않는 부분 종료 처리 (Unlock)
     END;

PROC_RETURN : BEGIN      -- BLOCK NAME 설정 (RETURN  유사 기능 처리. LEAVE  -> BREAK  비슷)
     IF NOT CHAR_LENGTH(vDoc) = 13 THEN     -- iDoc의 길이가 13 이지 않으면 반환
          SET iResult = 99999;
          LEAVE PROC_RETURN;
     END IF;
    
     SELECT doc INTO iSQLDoc FROM docTBL WHERE doc = vDoc; 
     SET @SQL_Query = CONCAT('INSERT INTO sequenceTBL VALUES(1, "', iSQLDoc, '", "', vDoc, '") ');
     PREPARE curQuery FROM @SQL_Query;
     EXECUTE curQuery;
     DEALLOCATE PREPARE curQuery;

-- TRANSACTION = lock (작업단위 락) / COMMIT or ROLLBACK = Unlock (작업단위 락 해제)
START TRANSACTION;
     INSERT INTO sequenceTBL VALUES(2, "', iSQLDoc, '", "', vDoc, '") ');
     INSERT INTO sequenceTBL VALUES(2, "', iSQLDoc, '", "', vDoc, '") ');     -- 중복 오류(예외처리) 발생 시.
     -- 예외 처리 발생 되면 DECLARE EXIT HANDLER FOR SQLEXCEPTION 실행.
     -- 예외 처리 발생 되면 DECLARE EXIT HANDLER FOR SQLWARNING 실행.
     -- 현재 부분 오류 시 COMMIT 나 ROLLBACK 종료 되지 않아 TRANSACTION 진행 상태로 다른 쿼리 대기 발생.

COMMIT;

END PROC_RETURN;    -- BLOCK NAME 설정 해제. LEAVE PROC_BODY; 이면 여기 이후로 실행.
     IF 0 <> iResult THEN
          SELECT iResult;

     ELSE
          SELECT 0;
     END IF;
 END$$

 

Posted by Mister_Q
[ Programing ]/Database2023. 5. 9. 13:33

MySQL의 프로시져는 return 이 없다.
코드를 구현하다보면 종료가 필요하기 마련인데 LEAVE 를 이용하면 return 과 비슷한 기능을 보여준다.
프로시저 시작하는 BEGIN 앞에 [BLOCK 이름] : 넣어주면 LEAVE [BLOCK이름]; 사용하여 종료할 수 있다.



DELIMITER $$
CREATE PROCEDURE sp_procedure_ex( IN vDoc VARCHAR(13), IN vSequenceID VARCHAR(256) )
BEGIN

     DECLARE iResult INT DEFAULT(0);
     DECLARE iSQLDoc VARCHAR(13);
PROC_RETURN :
BEGIN
     -- BLOCK NAME 설정 (RETURN  유사 기능 처리. LEAVE  -> BREAK  비슷)

     IF NOT CHAR_LENGTH(vDoc) = 13 THEN     -- iDoc의 길이가 13 이지 않으면 반환
          SET iResult = 99999;
          LEAVE PROC_RETURN;
     END IF;
    
     SELECT doc INTO iSQLDoc FROM docTBL WHERE doc = vDoc
     SET @SQL_Query = CONCAT('INSERT INTO sequenceTBL VALUES("', iSQLDoc, '", "', vDoc, '") ');
     PREPARE curQuery FROM @SQL_Query;
     EXECUTE curQuery;
     DEALLOCATE PREPARE curQuery;

     SELECT 0;
END PROC_RETURN;     -- BLOCK NAME 설정 해제. LEAVE PROC_BODY; 이면 여기 이후로 실행.
     IF 0 <> iResult THEN
          SELECT iResult;

     ELSE
          SELECT 0;
     END IF;
END$$
DELIMITER ;




참고 : 
https://artiiicy.tistory.com/15

 

PROCEDURE (프로시져) 도중에 중단하기 (return 0; 사용하기)

프로시져의 조건문에서 프로시져를 미리 마치는 경우 (예외처리가 되는 경우)를 만나게 되면 뒤의 나머지 코드들을 실행하지 않고 곧바로 종료분기를 하고 싶은 경우가 있습니다 즉, C, C++ 등의

artiiicy.tistory.com


https://stormpy.tistory.com/93

 

[MySQL] LEAVE , 프로시저 중에 중단하기

프로시저를 진행 중에 조건을 만족하지 않을 경우 실행을 중단하고 싶은 경우가 있다. 프로시저는 함수처럼 RETURN이 없어서 IF ~ END IF로 조건문으로 감싸서 해결하였는데 LEAVE를 사용하면 쉽게 해

stormpy.tistory.com

 
 

Posted by Mister_Q
[ Programing ]/Database2023. 5. 8. 16:09

- JOIN 아님.
- 단순 데이터 병합. (합집합)
- 2개의 쿼리를 위아래로 이어붙여 출력.
- 열의 개수가 같아야 함.

# UNION : 중복 제거, 정렬, 느림
# UNION ALL : 단순 모두 병합, 빠름

SELECT [COLUMN] 
   FROM [TABLE] 
   WHERE [COLUMN] = [VALUE]
UNION ALL
SELECT [COLUMN] 
   FROM [TABLE] 
   WHERE [COLUMN] = [VALUE];




참조 : https://blog.naver.com/avec_o/222747565180

 

[MySQL] 조인(JOIN)

조인(JOIN) - 한개 이상 테이블로 부터 데이터 조회 - 주로 Primary-Key와 Foreign-Key 관계를 가...

blog.naver.com

 

Posted by Mister_Q