프로시저 제거를 통해 알게된 내용

윤한영·2024년 6월 9일
0

SQL

목록 보기
2/2
post-thumbnail

회사에서 기존에 사용되던 프로시저 레거시들을 해체해서 mybatis에서
사용되는 형태로 수정하는 작업을 하게 되었다..

학교에서 전공 수업으로 이론만 배우고 간단한 실습만 해봤던 프로시저들..🙃

출처: 구글이미지(https://bart-park.tistory.com/1)


작업하면서 모르는 내용이 많아 공부하면서 조금씩 정리해봤습니다 !



프로시저 (PROCEDURE)

  • 특정 작업을 수행하는 SQL BLOCK.
  • 쿼리문을 하나의 메서드 형식으로 만들고 어떤 동작을 일괄적으로 처리하는 용도로 쓰인다.

👨‍💻 프로시저를 사용하는 이유
레거시인 만큼 기존에 회사에서 일을 하셨던 분들의 의도를 완전히 파악할 수는 없겠지만 프로시저의 장점과 관련이 있을 것 같습니다 !

  1. 하나의 요청으로 여러 SQL문을 실행시킬 수 있기때문에 네트워크 부하를 줄일 수 있다.
  2. API처럼 여러 애플리케이션과 공유가 가능하다
  3. 특정한 기능을 변경 시 프로시저만 변경하면 되기에 기능 변경이 편리하다.

🧐 그러면 이런 장점들이 있는데 왜 제거해야 할까?
  • 프로시저가 앱의 어디에 사용되는 지 확인이 어렵기에 유지보수가 어렵다.
    + 프로시저 내부의 동작을 확인하기 어려워 유지보수에 어려움이 있음.
  • 문자나 숫자 연산에 프로시저를 사용하면 오히려 C나 JAVA보다 처리 성능이 느리다.
이러한 단점이 존재해서 제거를 하게되는 것 같습니다. 😟

✅ cursor

  • 커서란?
    특정 SQL 문장을 처리한 결과를 담고 있는 영역을 가리키는 일종의 포인터입니다.
    커서를 사용하면 처리된 SQL 문장의 결과 집합에 접근할 수 있습니다.

ex> 커서 정의

DECLARE CURSOR_NAME_EX1 CURSOR FOR
        SELECT CODE, NAME
        FROM TABLE_A 
        WHERE A.CO_CODE = V_CO_CODE
		AND A.EMP_CODE = V_EMP_CODE; 

커서를 실행하면 해당 SELECT 쿼리가 실행되어 결과 집합이 메모리에 로드됩니다.
그 후 커서는 결과 집합을 가리키는 위치를 관리하면서 각 행을 차례로 가져옵니다.
각 행을 가져올 때마다, 커서는 그 행에 대한 데이터에 접근할 수 있게 됩니다.


  • 동작하는 방식 (사용하는 방식)
OPEN CURSOR_NAME_EX1;

	CUR_LOOP : LOOP
	FETCH CURSOR_NAME_EX1 INTO CODE, NAME; 
	…
	….

END LOOP;
CLOSE      CURSOR_NAME_EX1;

커서가 결과 집합의 한 행씩 접근하여 원하는(작성한) 로직을 처리할 수 있다.



✅ select into

CODE, NAME 컬럼을 가지고 있는 TABLE_A가 기존에 존재한다고 했을 때

CODENAME
code1name1
code2name2
code3name3
......
-- 새로운 테이블 생성 및 데이터 복사
SELECT *
INTO TABLE_A_COPY
FROM TABLE_A;

-- TABLE_A_COPY 테이블의 내용 확인
SELECT * FROM TABLE_A_COPY;

CODE | NAME
----------------------------
code1 | name1
code2 | name2
code3 | name3
…
…


✅ set = ‘ … ’

프로시저 내에서 정의한 지역변수에 원하는 값을 할당할 수 있습니다.

SET 이라는 명령어를 사용하여 변수에 값을 할당
ex> SET MY_NAME = ‘Yoon Han Young’;



✅ || 의 의미

|| 연산자는 문자열을 연결하는 연산자

DECLARE V_FIRST_NAME VARCHAR(50) = ‘Yoon’;
DECLARE V_LAST_NAME VARCHAR(50) = ‘Han Young’;
DECLARE V_FULL_NAME VARCHAR(100);

SET V_FULL_NAME = V_FIRST_NAME || ' ' || V_LAST_NAME;
PRINT V_FULL_NAME;	— 결과값 Yoon Han Young

✅ 활용

커서 내부의 SELECT 결과 집합이 아래와 같을 때


cursorSET, || 연산자를 이용하여 원하는 변수에 문자를 중첩시킬 수 있습니다.

ex>
DECLARE V_ACCT_CD    VARCHAR(10);	-- 변수 생성

-- 커서 정의
DECLARE CURSOR_NAME_EX1 CURSOR FOR
        SELECT CODE, NAME
        FROM TABLE_A 
        WHERE A.CO_CODE = V_CO_CODE
		AND A.EMP_CODE = V_EMP_CODE;

-- 커서 open
OPEN CURSOR_NAME_EX1;

	CUR_LOOP : LOOP
	FETCH CURSOR_NAME_EX1 INTO CODE, NAME; 
    
    -- 문자열 중첩
    SET V_CODE =and TABLE_A.CODE in (‘’’ || CODE || ‘’’);
	…
	…

END LOOP;
CLOSE      CURSOR_NAME_EX1;



/* 
V_CODE 에는 'and TABLE_A.CODE in (‘code1’, ‘code2’, ‘code3’, …)' 
이라는 문자열이 쌓이게 됨
*/

0개의 댓글