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 Tutorials 431 게시물 읽기
 News | Q&A | Columns | Tutorials | Devel | Files | Links
No. 431
DB2프로그램코딩예제
작성자
정재익(advance)
작성일
2002-10-17 19:47
조회수
16,224

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 ; 
[Top]
No.
제목
작성자
작성일
조회
434DB2 Limits
정재익
2002-10-17
9801
433BIND,PLAN,컴파일이 모지?,,,,
정재익
2002-10-17
9924
432PREFORMAT!... 그것이 알고싶다!!!
정재익
2002-10-17
8661
431DB2프로그램코딩예제
정재익
2002-10-17
16224
430PIECESIZE 란?
정재익
2002-10-17
7880
429파티션! 그것이 알고 싶다?
정재익
2002-10-17
8104
428DB2 SPACE(Tablespace,Index) 이야기
정재익
2002-10-17
10865
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.023초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다