회사에서 기존에 사용되던 프로시저 레거시들을 해체해서 mybatis에서
사용되는 형태로 수정하는 작업을 하게 되었다..
학교에서 전공 수업으로 이론만 배우고 간단한 실습만 해봤던 프로시저들..🙃
출처: 구글이미지(https://bart-park.tistory.com/1)
작업하면서 모르는 내용이 많아 공부하면서 조금씩 정리해봤습니다 !
👨💻 프로시저를 사용하는 이유
레거시인 만큼 기존에 회사에서 일을 하셨던 분들의 의도를 완전히 파악할 수는 없겠지만 프로시저의 장점과 관련이 있을 것 같습니다 !
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;
커서가 결과 집합의 한 행씩 접근하여 원하는(작성한) 로직을 처리할 수 있다.
CODE, NAME 컬럼을 가지고 있는 TABLE_A가 기존에 존재한다고 했을 때
CODE | NAME |
---|---|
code1 | name1 |
code2 | name2 |
code3 | name3 |
... | ... |
-- 새로운 테이블 생성 및 데이터 복사
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
이라는 명령어를 사용하여 변수에 값을 할당
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 결과 집합이 아래와 같을 때
cursor
와 SET
, || 연산자
를 이용하여 원하는 변수에 문자를 중첩시킬 수 있습니다.
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’, …)'
이라는 문자열이 쌓이게 됨
*/