database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
ㆍDB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
DB2 Q&A 1195 게시물 읽기
No. 1195
스토어프로시저 확인 부탁..
작성자
정재열(din102)
작성일
2006-11-30 15:46
조회수
9,028

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. 해당 로직을 처리하다 장애가 났을 경우 오류문자와 함께 프로시저가 종료때 정확히 장애메시지를 뿌릴지 누락 된 부분이 없는지

확인 부탁드리겠습니다.

[Top]
No.
제목
작성자
작성일
조회
1206DB2 Client Version 9설치 [2]
백구
2006-12-07
9105
1197DB2/400과 Oracle 간의 양방향 인터페이스 방법 문의 ? [1]
박준우
2006-12-04
7287
1196db2V8.1(fixpack6)에서 백업,리스토어 진행사항을 볼 수 있나여
궁금이
2006-12-01
7059
1195스토어프로시저 확인 부탁..
정재열
2006-11-30
9028
1194테이블과 칼럼을 못가져 옵니다. [1]
성광환
2006-11-30
7213
1193begin ... end; [1]
DB2처음이
2006-11-29
8044
1192DB2 Microsoft Transaction Server (MTS) [1]
DB2처음이
2006-11-29
7660
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.023초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다