CREATE PROCEDURE 함수명( 파라미터 목록)
LANGUAGE SQL
P1: BEGIN
-----------------------------------------------------------
-- 변수 선언부
-----------------------------------------------------------
-- SQLCODE,SQLSTATE 반환용 변수 선언
DECLARE SQLCODE INT DEFAULT 0;
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
-- 스토어드 프로시저 자체 리턴값
DECLARE v_ret_value INT DEFAULT 0;
-- 제어 변수 선언
DECLARE not_found CONDITION FOR SQLSTATE '02000';
DECLARE at_end INT DEFAULT 0; -- not_found
CONDITION 조건 발생시 1 , 아니면 0
DECLARE v_mainfetchend INT DEFAULT 0;
... 등 각종 선언
-----------------------------------------------------------
-- 커서 선언부
-----------------------------------------------------------
DECLARE c1 CURSOR FOR
SELECT *
FROM 테이블명
WHERE 조건
FOR FETCH ONLY;
-----------------------------------------------------------
-- 핸들러 선언부
-----------------------------------------------------------
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SET p_message = '오류 : SQLSTATE:' || SQLSTATE || ',' ||
CHAR(SQLCODE);
SET v_ret_value = -1;
END;
DECLARE CONTINUE HANDLER FOR not_found
SET at_end = 1; -- not_found 컨디션 발생시 1로 셋팅
-----------------------------------------------------------
-- TEMP TABLE 초기화
-----------------------------------------------------------
DELETE FROM REC.REC_1_CALLIDX_TEMP;
-----------------------------------------------------------
-- 커서를 열고, FETCH 하여 루프 돌면서 작업
-----------------------------------------------------------
SET at_end = 0; -- 우선 at_end 플래그를 0으로 셋팅
OPEN c1; -- c1 커서를 열고,
ins_loop:
LOOP -- 루프를 발생
-- c1 커서에서 하나의 레코드를 FETCH 하여 변수에 할당.
FETCH FROM c1 INTO 변수;
-- 더이상 처리할 데이터가 없을경우, not_found조건이 발생되어,
루프를 빠져나감
IF at_end = 1 THEN
LEAVE ins_loop;
ELSE
-- 해당 콜 인덱스의 통화시간 합계 및 건수를 구해 각 변수에
할당
SELECT *
INTO 변수1, 변수2
FROM 테이블명
WHERE 조건
IF((파라미터1 <> 0) AND (파라미터2 <> 0)) THEN
BEGIN
SET v_mainfetchend = at_end;
INSERT 테이블명
(
컬럼목록
)
VALUES
(
변수목록
);
SET at_end = v_mainfetchend;
END;
END IF;
END IF;
END LOOP;
CLOSE c1; -- c1 커서를 닫음
COMMIT;
-- 메시지 셋팅 및 처리 종료
SET p_message = '정상 처리 완료';
SET v_ret_value = 0;
RETURN v_ret_value;
END P1
이런식으로 스토어프로시저가 생성되어 있는데.. 몇가지 궁금한게
있어 질의드립니다.
1. 맨 윗쪽에 가장 먼저 나오는 커서 선언부의 Select 부분에서
디비2 TimeOut에 걸릴 경우 아래 선언한 not_found나 SQLException
영향을 받는지 궁금하며, 만약 해당 선언부를 윗쪽으로 옮기면
되는건지?
2. v_mainfetchend의 값이 at_end 인데 at_end는 조회건이 더이상
없을 경우 1로 발생합니다.. Insert 할때 v_mainfetchend에 값을 주거니
받거니 하는 이유에 대해 설명 부탁드립니다. 구지 필요 없는 부분
같아서요..
3. 해당 로직을 처리하다 장애가 났을 경우 오류문자와 함께
프로시저가 종료때 정확히 장애메시지를 뿌릴지 누락 된 부분이
없는지
확인 부탁드리겠습니다.
|