DB2프로그램코딩예제
DB2 프로그램을 처음 하시는 분을 위하여 기본적으로 DB2프로그램에서 사용되어지는 SQL문장 및 참고사항을유형별로 작성하였습니다. 전체적인 LOGIC보다는 부분별로 필요한 기능위주로 코딩 되었으니 필요한 부분은 업무에 참조하시기 바랍니다.
! 필요한 항목을 클릭 하세요 !
정보계 배치프로그램 LOGGING 매크로 문장.
SQLCA(SQL COMMUNICATION AREA) 선언문장.
프로그램에서 사용하는 테이블 선언문장.
FETCH 를 위한 CURSOR 정의 방법.
WHENEVER문장선언방법 및 주의사항.
SELECT 문장사용방법.
INSERT문장 사용방법.
UPDATE문장 사용방법.
DELETE문장 사용방법.
SQL WARNING 처리방법.
ONLY ONE ROW SELECT인경우의 사용방법.
NULL값의 처리방법.
다른 시스템의 테이블조회 방법.
WHENEVER …CONTINUE 문장의 사용방법.
SQL문장의 처리건수 확인방법.
TSO 화면에 MSG출력방법.
임의의 RETURN CODE DISPLAY 방법.
COMMIT 및 ROLLBACK문장 사용방법 및 주의사항.
DB2 ERROR MSG 상세 출력방법.
전체정보출력
정보계 배치프로그램 LOGGING 매크로 문장.
%INCLUDE $MRDLOGP; /* [b][color=BLUE]DB2 BATCH 프로그램 LOGGING MACRO[/color][/b] */
/* DB2 SQL문장을 사용하는 모든 배치프로그램의 경우 반드시 코딩해야함 */
/*-------------------------------------------------------------------*/
DCL CARDIN FILE INPUT STREAM ;
DCL SYSPRINT FILE OUTPUT STREAM ;
DCL PRINT FILE OUTPUT RECORD ENV(F BLKSIZE(133) CTLASA) ;
/*-------------------------------------------------------------------*/
DCL PLIRETV BUILTIN ;
DCL PLIRETC BUILTIN ;
DCL MIN BUILTIN ;
DCL ADDR BUILTIN ;
DCL NULL BUILTIN ;
DCL DATE BUILTIN ;
DCL SUBSTR BUILTIN ;
/*-------------------------------------------------------------------*/
DCL WMSG CHAR(51) INIT('') ;
DCL YES CHAR (01) INIT('') ;
DCL WCNT DEC FIXED(5,0) INIT('0');
DCL WDATE CHAR(10) INIT('') ;
DCL IND1 FIXED BIN(15) INIT(0) ;
/*------------------------------------------------------------------*/
DCL IPO1 CHAR(06) INIT('DB2P05') ; /*1호기LOCATION명 */
DCL IPO2 CHAR(06) INIT('DB2T02') ; /*2호기LOCATION명 */
DCL IPO3 CHAR(06) INIT('DB2P03') ; /*3호기LOCATION명 */
DCL IPO4 CHAR(06) INIT('DB2T01') ; /*4호기LOCATION명 */
DCL IPO5 CHAR(06) INIT('DB2T04') ; /*5호기LOCATION명 */
/*------------------------------------------------------------------*/
DCL CARD_IN CHAR(80);
DCL 1 CARD_INR BASED (ADDR(CARD_IN)) ,
3 CHECK CHAR(03) , /* CARD INPUT 구분*/
3 FILLER1 CHAR(01) ,
3 C_EMPNO PIC '99999' , /*직원번호*/
3 FILLER2 CHAR(01) ,
3 C_MKNAME CHAR(08) , /*한글성명*/
3 FILLER3 CHAR(01) ,
3 C_MCNAME CHAR(08) , /*한자성명*/
3 FILLER4 CHAR(01) ,
3 C_MBIRTHDAY CHAR(10) , /*생년월일*/
3 FILLER5 CHAR(01) ,
3 C_MSEX CHAR(01) , /*성별*/
3 FILLER6 CHAR(01) ,
3 C_MJUMINO CHAR(14) , /*주민번호*/
3 FILLER7 CHAR(01) ,
3 C_MENTERDAY CHAR(10) , /*입행일*/
3 FILLER8 CHAR(01) ,
3 C_MBRANCH PIC '999' , /*소속*/
3 FILLER9 CHAR(11) ;
/*------------------------------------------------------------------*/
DCL 1 SAFT02_WK,
3 S_EMPNO FIXED BIN(31) INIT (''),
3 S_MKNAME CHAR(14),
3 S_MCNAME CHAR(14),
3 S_MBIRTHDAY CHAR(10),
3 S_MSEX CHAR(01),
3 S_MJUMINO CHAR(14),
3 S_MENTERDAY CHAR(10),
3 S_MBRANCH FIXED BIN(31) INIT ('');
/*------------------------------------------------------------------*/
DCL 1 TITLE,
3 ASA CHAR(01) INIT('') ,
3 HEAD01 CHAR(12) INIT('직원번호'),
3 HEAD02 CHAR(12) INIT('한글성명'),
3 HEAD03 CHAR(12) INIT('한자성명'),
3 HEAD04 CHAR(12) INIT('생년월일'),
3 HEAD06 CHAR(08) INIT('성별') ,
3 HEAD07 CHAR(14) INIT('주민번호'),
3 HEAD08 CHAR(12) INIT('입행일') ,
3 HEAD09 CHAR(06) INIT('소속') ,
3 FIL01 CHAR(44) INIT(' ') ;
/*------------------------------------------------------------------*/
DCL 1 LIST,
3 ASA CHAR(01) INIT(' '),
3 W_EMPNO PIC 'ZZZZZ9' ,
3 FILLER1 CHAR(06) INIT(''),
3 W_MKNAME CHAR(14) ,
3 W_MCNAME CHAR(14) ,
3 W_MBIRTHDAY CHAR(14) ,
3 W_MSEX CHAR(03) ,
3 W_MJUMINO CHAR(16) ,
3 W_MENTERDAY CHAR(13) ,
3 W_MBRANCH PIC '999' ,
3 FILLER2 CHAR(43) INIT('');
/*------------------------------------------------------------------*/
DCL 1 LINE1,
3 ASA CHAR(01) INIT(' ') ,
3 FIL01 CHAR(01) INIT(' ') ,
3 LINEA CHAR(090) INIT((090)'-'),
3 FIL02 CHAR(41) INIT(' ') ;
/*------------------------------------------------------------------*/
DCL 1 LINE2,
3 ASA CHAR(01) INIT(' ') ,
3 FIL01 CHAR(01) INIT(' ') ,
3 LINEB CHAR(090) INIT((090)'='),
3 FIL02 CHAR(41) INIT(' ') ;
/*------------------------------------------------------------------*/
/* DECLARE TABLE */
/* [b][color=BLUE]프로그램에서 사용하는 테이블 선언문장[/color][/b] */
/*------------------------------------------------------------------*/
EXEC SQL INCLUDE SQLCA ; /* [b][color=BLUE]SQLCA(SQL COMMUNICATION AREA) 선언문장. [/color][/b]*/
EXEC SQL INCLUDE SAF02DCP ; /*직원기본테이블 INCLUDE */
/*------------------------------------------------------------------*/
/* DECLARE CURSOR FOR TABLE(SAFT02) DISPLAY */
/*------------------------------------------------------------------*/
EXEC SQL DECLARE SAFT02_Q CURSOR FOR
SELECT EMPNO,
MKNAME,
MCNAME,
MBIRTHDAY,
MSEX,
MJUMINO,
MENTERDAY,
MBRANCH
FROM SAFT02.MASTER ;
/* 조회결과, 조건에 맞는 ROW 수 가 2개 이상인 SELECT 문의 경우에는
반드시 CURSOR을 선언하고,FETCH 문장을 사용하여야 함 */
/*------------------------------------------------------------------*/
/* SQL ERROR,WARNING CHECK ! */
/*------------------------------------------------------------------*/
EXEC SQL WHENEVER SQLERROR GOTO SQL_ERROR1;
EXEC SQL WHENEVER SQLWARNING GOTO SQL_ERROR ;
/* WHENEVER 문장 기술시 각 SQL문에서 별도로 SQLCODE 조건 CHECK를
하더라도 WHENVER문장이 항상 우선적용되니 주의 바람 */
EXEC SQL WHENEVER NOT FOUND CONTINUE; /*별도의CHECK LOGIC필요*/
/*------------------------------------------------------------------*/
/* MAIN PROGRAM */
/*------------------------------------------------------------------*/
GET FILE(CARDIN) EDIT(CARD_IN) (A(80));
SELECT(CHECK);
WHEN ('SEL') CALL SELECT_RTN; /*순수조회테스트*/
/* 현재는 NULL값이 있는경우에는 -305ERROR발생*/
WHEN ('INS') CALL INSERT_RTN; /*레코드추가테스트*/
WHEN ('UPD') CALL UPDATE_RTN; /*기존값변경테스트*/
WHEN ('DEL') CALL DELETE_RTN; /*레코드삭제테스트*/
WHEN ('WAN') CALL SQL_WARNING_TEST_RTN;
/*SQL WARNING CHECK 테스트*/
WHEN ('ONE') CALL SQL_ONE_ROW_TEST_RTN;
/*조회결과의ROW가 하나뿐인경우의 조회테스트*/
WHEN ('IND') CALL SQL_IND_CHK_TEST_RTN;
/*NULL 값을포함한조회 테스트*/
WHEN ('DDF') CALL SQL_DDF_TEST_RTN;
/*다른시스템간의DB2테이블조회테스트*/
OTHERWISE DO;
PUT SKIP LIST ('-----------------------------');
PUT SKIP LIST ('-- CARD INPUT DATA ERROR --');
PUT SKIP LIST ('-----------------------------');
END;
END;
CALL CLOSE_RTN;
RETURN;
/*-----------------------------------------------------------------*/
/* SELECT_RTN */
/*-----------------------------------------------------------------*/
SELECT_RTN: PROC;
CALL WRITE_TITLE_RTN;
EXEC SQL OPEN SAFT02_Q ;
DO WHILE (SQLCODE ^= 100) ;
EXEC SQL FETCH SAFT02_Q
INTO :S_EMPNO ,
:S_MKNAME ,
:S_MCNAME ,
:S_MBIRTHDAY ,
:S_MSEX ,
:S_MJUMINO ,
:S_MENTERDAY ,
:S_MBRANCH;
IF SQLCODE ^= 100
THEN CALL WRITE_LIST_RTN;
ELSE ;
END;
EXEC SQL CLOSE SAFT02_Q;
END SELECT_RTN;
/*-----------------------------------------------------------------*/
/* INSERT_RTN */
/*-----------------------------------------------------------------*/
INSERT_RTN: PROC;
S_EMPNO = C_EMPNO ; /* DATA TYPE 변환*/
S_MBRANCH = C_MBRANCH ;
EXEC SQL INSERT INTO SAFT02.MASTER
(EMPNO, MKNAME, MCNAME, MBIRTHDAY, MSEX,
MJUMINO, MENTERDAY, MBRANCH)
VALUES (:S_EMPNO, :C_MKNAME, :C_MCNAME, :C_MBIRTHDAY,
:C_MSEX, :C_MJUMINO, :C_MENTERDAY, :S_MBRANCH);
IF SQLCODE = 0
THEN DO;
PUT SKIP LIST ('* SAFT02 INSERT ROW SU => ',SQLERRD(3));
EXEC SQL SELECT EMPNO, MKNAME, MCNAME, MBIRTHDAY,
MSEX, MJUMINO, MENTERDAY, MBRANCH
INTO :S_EMPNO, :S_MKNAME,
:S_MCNAME, :S_MBIRTHDAY,
:S_MSEX, :S_MJUMINO,
:S_MENTERDAY,:S_MBRANCH
FROM SAFT02.MASTER
WHERE EMPNO = :S_EMPNO ;
IF SQLCODE ^= 100
THEN DO;
CALL WRITE_TITLE_RTN ;
CALL WRITE_LIST_RTN ;
END;
ELSE ;
END;
ELSE PUT SKIP LIST ('*** SAFT02 TABLE INSERT ERRROR ***');
END INSERT_RTN;
/*------------------------------------------------------------------*/
/* UPDATE_RTN */
/*------------------------------------------------------------------*/
UPDATE_RTN: PROC;
PUT SKIP LIST ('C_EMPNO => ',C_EMPNO);
S_EMPNO = C_EMPNO; /* DATA TYPE 변환*/
/* PIC에서 BIN으로 TYPE 변환시 영문은 숫자로 변환됨(?)
(예:영문K(X'D2) == >숫자2 ) */
PUT SKIP LIST ('S_EMPNO => ',S_EMPNO);
S_MBRANCH = C_MBRANCH ;
EXEC SQL WHENEVER SQLERROR CONTINUE; /* 기존 WHENEVER 무시
( 별도의 SQL CHK 루틴 필요 ) */
EXEC SQL UPDATE SAFT02.MASTER
SET MENTERDAY = NULL, /* NULL값SET */
/* MENTERDAY =:C_MENTERDAY, <=동시여러항목 UPDATE */
MBRANCH = :S_MBRANCH
WHERE EMPNO = :S_EMPNO ;
IF SQLCODE = 0
THEN DO;
PUT SKIP LIST ('* SAFT02 UPDATE ROW SU => ',SQLERRD(3));
EXEC SQL SELECT EMPNO, MKNAME, MCNAME, MBIRTHDAY,
MSEX, MJUMINO, MENTERDAY, MBRANCH
INTO :S_EMPNO, :S_MKNAME,
:S_MCNAME, :S_MBIRTHDAY,
:S_MSEX, :S_MJUMINO,
:S_MENTERDAY,:S_MBRANCH
FROM SAFT02.MASTER
WHERE EMPNO = :S_EMPNO ;
IF SQLCODE ^= 100
THEN DO;
CALL WRITE_TITLE_RTN ;
CALL WRITE_LIST_RTN ;
END;
ELSE ;
END;
ELSE DO;
PUT SKIP LIST ('*** SAFT02 TABLE UPDATE ERRROR ***');
GOTO SQL_ERROR1;
END;
END UPDATE_RTN;
/*----------------------------------------------------------------*/
/* DELETE_RTN */
/*----------------------------------------------------------------*/
DELETE_RTN: PROC;
S_EMPNO = C_EMPNO ; /* DATA TYPE 변환 */
CALL SQL_IND_CHK_TEST_RTN; /* DELETE전 전체LIST PRINT */
EXEC SQL DELETE FROM SAFT02.MASTER
WHERE EMPNO = :S_EMPNO ;
IF SQLCODE = 0
THEN DO;
PUT SKIP LIST
('* SAFT02 DELETE ROW SU => ',SQLERRD(3));
/* SQLERRD(3) => 실제 수행된SQL문장의 COUNT가 있는자리
(별도의 SQL 처리건수 확인을 위한 LOGIC 불 필요) */
CALL SELECT_RTN; /* DELETE후 전체LIST PRINT */
END;
ELSE PUT SKIP LIST ('*** SAFT02 TABLE DELETE ERRROR ***');
END DELETE_RTN;
/*----------------------------------------------------------------*/
/* SQL_WARNING_TEST_RTN */
/* ( S_MBRANCH 생략<== WARNING TEST 을 위함) */
/*----------------------------------------------------------------*/
SQL_WARNING_TEST_RTN: PROC;
CALL WRITE_TITLE_RTN;
EXEC SQL OPEN SAFT02_Q ;
DO WHILE (SQLCODE ^= 100) ;
EXEC SQL FETCH SAFT02_Q
INTO :S_EMPNO ,
:S_MKNAME ,
:S_MCNAME ,
:S_MBIRTHDAY ,
:S_MSEX ,
:S_MJUMINO ,
:S_MENTERDAY ; /* CURSET 선언한것 중에
MBRANCH 가 빠짐*/
IF SQLCODE ^= 100
THEN CALL WRITE_LIST_RTN ;
ELSE ;
END;
EXEC SQL CLOSE SAFT02_Q ;
END SQL_WARNING_TEST_RTN;
/*----------------------------------------------------------------*/
/* SELECT ONLY ONE_ROW TEST_RTN */
/* (DISPLAY,REPLY TEST 포함) */
/*----------------------------------------------------------------*/
SQL_ONE_ROW_TEST_RTN: PROC;
EXEC SQL SELECT MAX(MBIRTHDAY) INTO :WDATE
FROM SAFT02.MASTER;
PUT SKIP LIST ('* SAFT02 MAX_DATE => ',WDATE);
EXEC SQL SELECT COUNT(*) INTO :WCNT
FROM SAFT02.MASTER;
PUT SKIP LIST ('* SAFT02 COUNT => ',WCNT);
/*----------------------------------------------------*/
/* TSO LOG화면에MSG을 출력하는 방법TEST RTN */
/*----------------------------------------------------*/
WMSG = '** MSG DISPLAY TEST ==>']]WDATE]]' **';
DISPLAY (WMSG) REPLY (YES);
PUT SKIP LIST ('* REPLY VALUE => ',YES);
/* REPLY 값(YES)을 입력변수로도 사용가능 */
END SQL_ONE_ROW_TEST_RTN;
/*----------------------------------------------------------------*/
/* DDF TEST_RTN ( 반드시 PACKAGE로 등록해야 함 ) */
/*-----------------------------( DBA팀 사전 협의 )----------------*/
SQL_DDF_TEST_RTN: PROC;
EXEC SQL CONNECT TO :IPO3 ; /* 3호기연결시작*/
EXEC SQL SELECT MAX(MBIRTHDAY) INTO :WDATE
FROM SAFT02.MASTER;
PUT SKIP LIST ('* IPO3 SAFT02 MAX_DATE => ',WDATE);
EXEC SQL CONNECT RESET; /*3호기연결해제*/
EXEC SQL SELECT MAX(MBIRTHDAY) INTO :WDATE /* 5 호기작업*/
FROM SAFT02.MASTER;
PUT SKIP LIST ('* IPO5 SAFT02 MAX_DATE => ',WDATE);
EXEC SQL CONNECT TO :IPO3 ; /* 3호기다시연결*/
EXEC SQL SELECT MIN(MBIRTHDAY) INTO :WDATE
FROM SAFT02.MASTER WHERE MBIRTHDAY < :WDATE;
/* WHERE 조건의WDATE => 5호기테이블에서SELECT한 값*/
PUT SKIP LIST ('* IPO3 SAFT02 MIN_DATE => ',WDATE);
EXEC SQL CONNECT RESET; /*3호기연결해제*/
/* EXEC SQL RELEASE :SITE 명 */
/* EXEC SQL RELEASE CURRENT */
/* EXEC SQL RELEASE ALL PRIVATE */
END SQL_DDF_TEST_RTN;
/*----------------------------------------------------------------*/
/* INDCATE CHECK TEST_RTN */
/* ( NULL값을 허용하는 컬럼조회시(컬럼평선포함)반드시CHECK */
/*----------------------------- ( SUM,MIN,AVG,MAX,COUNT ) --------*/
SQL_IND_CHK_TEST_RTN: PROC;
CALL WRITE_TITLE_RTN;
EXEC SQL OPEN SAFT02_Q ;
DO WHILE (SQLCODE ^= 100) ;
EXEC SQL FETCH SAFT02_Q
INTO :S_EMPNO ,
:S_MKNAME ,
:S_MCNAME ,
:S_MBIRTHDAY ,
:S_MSEX ,
:S_MJUMINO ,
:S_MENTERDAY:IND1,
:S_MBRANCH ;
IF IND1 < 0 /* NULL값CHECK,필요에따라별도의LOGIC필요 */
THEN S_MENTERDAY = '<< NULL >>';
IF SQLCODE ^= 100
THEN CALL WRITE_LIST_RTN ;
ELSE ;
END;
EXEC SQL CLOSE SAFT02_Q ;
END SQL_IND_CHK_TEST_RTN;
/*------------------------------------------------------------------*/
/*-------------->> WRITE_RTN <<------------*/
/*------------------------------------------------------------------*/
WRITE_TITLE_RTN: PROC;
WRITE FILE(PRINT) FROM(LINE2) ;
WRITE FILE(PRINT) FROM(TITLE) ;
WRITE FILE(PRINT) FROM(LINE2) ;
END WRITE_TITLE_RTN;
/*------------------------------------------------------------------*/
/*-------------->> WRITE_RTN <<------------*/
/*------------------------------------------------------------------*/
WRITE_LIST_RTN: PROC;
W_EMPNO = S_EMPNO ;
W_MKNAME = S_MKNAME ;
W_MCNAME = S_MCNAME ;
W_MBIRTHDAY = S_MBIRTHDAY ;
W_MSEX = S_MSEX ;
W_MJUMINO = S_MJUMINO ;
W_MENTERDAY = S_MENTERDAY ;
W_MBRANCH = S_MBRANCH ;
WRITE FILE(PRINT) FROM(LIST) ;
WRITE FILE(PRINT) FROM(LINE1);
END WRITE_LIST_RTN;
/*------------------------------------------------------------------*/
/*-------------->> CLOSE ROUNTINE <<-----------*/
/*------------------------------------------------------------------*/
CLOSE_RTN: PROC;
PUT SKIP LIST ('***********************************************');
PUT SKIP LIST ('*** JOB OK ***');
PUT SKIP LIST ('***********************************************');
PUT SKIP LIST ('*** HAVE A NICE DAY ! ***');
PUT SKIP LIST ('***********************************************');
END CLOSE_RTN;
/*------------------------------------------------------------------*/
/*---------------->> SQL ERROR RTN <<----------------*/
/*------------------------------------------------------------------*/
SQL_ERROR:
PUT SKIP FILE(SYSPRINT) LIST
('>>> SQL ERROR(CODE)===> ',SQLCODE) ;
PUT SKIP LIST ('* WARNING0 = ',SQLWARN0);
/* WARNING이 발생하면 반드시 SQLWARN0 자리에 'W' 가 나옴 */
SELECT;
WHEN(SQLWARN1 = 'W') PUT SKIP LIST ('* WARNING1 = ',SQLWARN1);
WHEN(SQLWARN2 = 'W') PUT SKIP LIST ('* WARNING2 = ',SQLWARN2);
WHEN(SQLWARN3 = 'W') PUT SKIP LIST ('* WARNING3 = ',SQLWARN3);
WHEN(SQLWARN4 = 'W') PUT SKIP LIST ('* WARNING4 = ',SQLWARN4);
WHEN(SQLWARN5 = 'W') PUT SKIP LIST ('* WARNING5 = ',SQLWARN5);
WHEN(SQLWARN6 = 'W') PUT SKIP LIST ('* WARNING6 = ',SQLWARN6);
WHEN(SQLWARN7 = 'W') PUT SKIP LIST ('* WARNING7 = ',SQLWARN7);
WHEN(SQLWARN8 = 'W') PUT SKIP LIST ('* WARNING8 = ',SQLWARN8);
WHEN(SQLWARN9 = 'W') PUT SKIP LIST ('* WARNING9 = ',SQLWARN9);
WHEN(SQLWARNA = 'W') PUT SKIP LIST ('* WARNINGA = ',SQLWARNA);
OTHERWISE; /* SQL_WARNING 종류를 알기 위한 DISPLAY 문
END; SQLWARN1->SQLWARNA 자리는 WARNING 종류임 */
CALL PLIRETC(77); /*임의로 RETURN CODE DISPLAY */
/* DB2 ERROR('-'SQL코드발생) 발생해도BATCH 작업결과는
정상(RC=0)으로 표시되는 것을 방지하기 위함 */
EXEC SQL COMMIT; /*현재까지수행분을시스템상정상처리시킴*/
RETURN;
/*------------------------------------------------------------------*/
SQL_ERROR1:
%INCLUDE $MRDMSGP; /* DB2 DETAIL ERROR MSG PRINT MACRO */
/* BATCH 프로그램에서도 다이나믹SQL 사용시처럼 상세한 DB2 ERROR
MSG 출력하고자 할때 사용 하는 메크로 임(사용권장) */
CALL PLIRETC(88); /* 임의로 RETURN CODE DISPLAY */
/* DB2 ERROR('-'SQL코드발생) 발생해도BATCH 작업결과는
정상(RC=0)으로 표시되는 것을 방지하기 위함 */
EXEC SQL ROLLBACK;
/* 현재까지 수행분을 작업시작전 혹은 최종 COMMIT
시점까지 원위치 시킴*/
/* COMMIT와 ROLLBACK 처리에 대하여 */
/* 1. 대량 DATA의 갱신작업(INSERT,UPDATE,DELETE)시에는 일정건수
처리후 COMMIT 처리 여부를 검토.
(작업도중 비정상종료시 ROLLBACK 처리시간 단축 및 재작업
시간 단축(LOCK해제포함))
2. COMMIT 처리시에는 최종 COMMIT 시점의 ROW 정보 및 처리건수
등을 별도로 관리하여 재 작업시 INPUT등의 정보로 사용한다.
(물론 LOGIC 상에는 재작업에 필요한 LOGIC처리는 필수)
3. FETCH를 이용한 UPDATE,DELETE 문장의 COMMIT 처리 경우에는
반드시 WITH HOLD 을 사용하여 CURSOR 선언을 할 것
( COMMIT 시점의 POSITION 유지를 위함,
형태 : DECLARE 커서명 CURSOR WITH HOLD FOR 조회문장 )
4. COMMIT 건수는 시스템상태나 프로그램 성격에 따라 다르며,
작업환경에 따라 조정 할 수 있는 LOCIC 검토
(COMMIT건수를 CARD 혹은 DB로 조정)
* COMMIT를 자주 하면 ERROR 발생시 ROLLBACK 처리시간 단축 및
LOCK 해제를 빨리 할 수 있으나 시스템의 부하를 줄 수 있음.
(시스템측면에서 보면 시스템상태가 양호하거나 온라인종료후
작업시에는 COMMIT를 자주하고,
시스템이 바쁘거나 온라인중에는 COMMIT 자주 않음)*/
RETURN;
/*------------------------------------------------------------------*/
END PGM000 ;
|