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
운영게시판
최근게시물
Oracle Q&A 39035 게시물 읽기
No. 39035
알수가 없네요 커서가 안닫히는..
작성자
지나(duckjina)
작성일
2011-11-02 14:59
조회수
5,562

정상적으로 작업수행후

커서가 닫히지 않고 다시 돕니다..결국  무결성에러

 

update를 지우면 정상적으로 잘 됩니다..

 

update 문만 추가했는데 안되는 이유가 몰까요?

=======================================

 

CREATE OR REPLACE PROCEDURE HAKSA.SP_HR_2050802_P01(
/-----------------------------------------------------------------------
수 정 일  :        수 정 자 :
 
 
******************************************************************************/

    IN_BANK_CD           IN                 HR_VIRTUALGYEJWA_M.BANK_CD%TYPE,          --은행
    IN_YEAR              IN                 HR_DEUNGROK_DAESANGJA_M.YEAR%TYPE,        --년도
    IN_HAKGI             IN                 HR_DEUNGROK_DAESANGJA_M.HAKGI%TYPE,       --학기
    IN_DAESANG_GBCD      IN                 HR_DEUNGROK_DAESANGJA_M.DAESANG_GBCD%TYPE,--대상구분
   
    IN_ID                IN                 HR_VIRTUALGYEJWA_M.INSERT_ID%TYPE ,
    IN_IP                IN                 HR_VIRTUALGYEJWA_M.INSERT_IP%TYPE ,
    IN_PGM               IN                 HR_VIRTUALGYEJWA_M.INSERT_PGM%TYPE ,
   
    OUT_CNT             OUT                 VARCHAR2,
    OUT_MSG             OUT                 VARCHAR2


)
AS
   
     D_HAKBEON                              HR_DEUNGROK_DAESANGJA_M.HAKBEON%TYPE;
     D_BANK_CD                              HR_VIRTUALGYEJWA_M.BANK_CD%TYPE;
     D_VIRTUALGYEJWA_NO                     HR_VIRTUALGYEJWA_M.VIRTUALGYEJWA_NO%TYPE;              
     --D_EOPMU_GBCD                           HR_VIRTUALGYEJWA_M.EOPMU_GBCD%TYPE;
     D_SAYONG_YN                            HR_VIRTUALGYEJWA_M.SAYONG_YN%TYPE;    
   
     R_CNT                                  NUMBER(8);
     D_CNT                                  NUMBER(8);
    
     TEMP_D_BANK_CD                              HR_VIRTUALGYEJWA_M.BANK_CD%TYPE;
     TEMP_D_VIRTUALGYEJWA_NO                     HR_VIRTUALGYEJWA_M.VIRTUALGYEJWA_NO%TYPE;              
     
           
    BEGIN
              /* ******************************************************* */
              /* OUT 변수 초기화                                         */
              /* ******************************************************* */
               OUT_MSG              := '';
               OUT_CNT              := '0';
               TEMP_D_BANK_CD := '';
               TEMP_D_VIRTUALGYEJWA_NO := '';

                BEGIN
                              SELECT COUNT(*)
                              INTO D_CNT
                              FROM
                                     HR_DEUNGROK_DAESANGJA_M
                              WHERE
                                         YEAR = IN_YEAR      --년도
                                     AND HAKGI = IN_HAKGI --학기
                                     AND HAKBEON NOT IN
                                                      (
                                                        SELECT
                                                               HAKBEON
                                                        FROM
                                                               HR_VIRTUALGYEJWA_M
                                                        WHERE  BANK_CD = IN_BANK_CD
                                                          AND      SAYONG_YN='1'
                                                       )  ;
                EXCEPTION                      
                WHEN OTHERS THEN 
                    OUT_MSG := SQLERRM || CHR(13) || 'ERR01: 해당은행코드에 현재 미사용된 계좌번호가 더이상 존재하지 않습니다2.\n\n';
                    OUT_CNT := '0';
                    ROLLBACK;
                    RETURN;                           
                 END;
               
               DECLARE CURSOR CUR_BANK_CD_IN IS   --  커서 선언: HR_DEUNGROK_DAESANGJA_M 의 대상자 학번 가져오기.
                  SELECT
                         HAKBEON
                  FROM
                         HR_DEUNGROK_DAESANGJA_M
                  WHERE
                             YEAR = IN_YEAR      --년도
                         AND HAKGI = IN_HAKGI --학기
                         AND HAKBEON NOT IN
                                          (
                                            SELECT
                                                   HAKBEON
                                            FROM
                                                   HR_VIRTUALGYEJWA_M
                                            WHERE  BANK_CD = IN_BANK_CD
                                               AND    SAYONG_YN='1'
                                           )
                   ORDER BY
                           HAKBEON    
                   ;

        
                   BEGIN                  
                           R_CNT := 0;
                          OPEN CUR_BANK_CD_IN;                           
                          LOOP
   
                               FETCH CUR_BANK_CD_IN INTO  D_HAKBEON ;
                                 
                                 EXIT WHEN  CUR_BANK_CD_IN%NOTFOUND;  
                                 
                                 
                                  BEGIN             
                                           D_BANK_CD := NULL;
                                           D_VIRTUALGYEJWA_NO := NULL;
                                         
                                          --가상계좌코드 테이블에서 해당은행의 미사용 계좌번호 SELECT
                                            SELECT
                                                   BANK_CD
                                                  ,VIRTUALGYEJWA_NO
                                                  --,EOPMU_GBCD
                                               INTO
                                                   D_BANK_CD
                                                  ,D_VIRTUALGYEJWA_NO
                                                  --,D_EOPMU_GBCD
                                            FROM(
                                                   SELECT
                                                          BANK_CD
                                                         ,VIRTUALGYEJWA_NO
                                                         --,EOPMU_GBCD
                                                   FROM
                                                         HR_VIRTUALGYEJWA_C
                                                   WHERE
                                                         NVL(SAYONG_YN,'2')='2'
                                                         AND BANK_CD = IN_BANK_CD
                                                   ORDER BY
                                                           BANK_CD
                                                          ,VIRTUALGYEJWA_NO
                                                 )
                                             WHERE ROWNUM = 1; 
                                            
                                             EXCEPTION WHEN NO_DATA_FOUND THEN
                                             --OUT_MSG := SQLERRM || CHR(13) || '\N\NERR01: 해당은행코드에 현재 미사용된 계좌번호가 더이상 존재하지 않습니다.\N\N[' || R_CNT ||'개의 데이터]는 정상처리 되었습니다.'  ;
                                             OUT_MSG := 'ERR01: 해당은행코드에 현재 미사용된 계좌번호가 더이상 존재하지 않습니다.\n\n';
                                             IF R_CNT > 0 THEN
                                              OUT_MSG := OUT_MSG ||  '[' || R_CNT ||'개의 데이터]는 정상처리 되었습니다.'  ;
                                             END IF;
                                                                                        
                                             OUT_CNT :=  R_CNT;
                                             RETURN;
                                            
                                             WHEN OTHERS THEN 
                                                   OUT_MSG := SQLERRM || CHR(13) || 'ERR01: 해당은행코드에 현재 미사용된 계좌번호가 더이상 존재하지 않습니다2.\n\n';
                                                   OUT_CNT := '0';
                                                   ROLLBACK;
                                                   RETURN;
                                            
                                  END;          
                                                                   
                                      BEGIN
                                             
                                         INSERT INTO HR_VIRTUALGYEJWA_M
                                                                   (
                                                                    BANK_CD
                                                                   ,VIRTUALGYEJWA_NO
                                                                   ,EOPMU_GBCD
                                                                   ,HAKBEON
                                                                   ,SAYONG_YN
                                                                   ,INSERT_ID
                                                                   ,INSERT_IP
                                                                   ,INSERT_PGM
                                                                   ,INSERT_DATE
                                                                   )VALUES
                                                                   (
                                                                    D_BANK_CD
                                                                   ,D_VIRTUALGYEJWA_NO
                                                                   ,'01'
                                                                   ,D_HAKBEON
                                                                   ,'1'
                                                                   ,IN_ID
                                                                   ,IN_IP
                                                                   ,IN_PGM
                                                                   ,SYSDATE
                                                                   );      
                                                                                      
                                         EXCEPTION WHEN OTHERS THEN 
                                                   OUT_MSG :=  D_BANK_CD ||':'|| D_VIRTUALGYEJWA_NO ||':'|| D_HAKBEON ||':'|| SQLERRM ||':'|| CHR(13) ||':'|| 'ERR02: 가상계좌번호 부여시 오류가 발생하여 종료됩니다.' ;
                                                   OUT_CNT := '0';
                                                   ROLLBACK;
                                                   RETURN;
                                     END;


                                      BEGIN                     
                                                         
                                         UPDATE
                                                                  HR_VIRTUALGYEJWA_C
                                              SET
                                                                  SAYONG_YN='1'
                                                                  ,EOPMU_GBCD = '01'
                                                                  ,UPDATE_ID = IN_ID
                                                                  ,UPDATE_IP = IN_IP
                                                                  ,UPDATE_PGM = IN_PGM
                                                                  ,UPDATE_DATE = SYSDATE  
                                               WHERE
                                                                  BANK_CD = D_BANK_CD 
                                                                  AND VIRTUALGYEJWA_NO = D_VIRTUALGYEJWA_NO
                                                              ;                    
                                        
                                                                                      
                                         EXCEPTION WHEN OTHERS THEN 
                                                   OUT_MSG :=  D_BANK_CD ||':'|| D_VIRTUALGYEJWA_NO ||':'|| D_HAKBEON ||':'|| SQLERRM ||':'|| CHR(13) ||':'|| 'ERR02: 가상계좌번호 업데이트시 오류가 발생하여 종료됩니다.' ;
                                                   OUT_CNT := '0';
                                                   ROLLBACK;
                                                   RETURN;
                                     END;
                                        
                                     
                                             R_CNT := R_CNT + 1;
                                       
                                      D_BANK_CD := NULL;
                                      D_VIRTUALGYEJWA_NO := NULL;
                                      OUT_MSG := OUT_MSG + D_BANK_CD;
                                     
                                
                                
                             
                                  
                           END LOOP;
                          
                     CLOSE CUR_BANK_CD_IN;
                     --DEALLOCATE CUR_BANK_CD_IN;
                      
                       EXCEPTION WHEN OTHERS THEN 
                         OUT_MSG := SQLERRM || CHR(13) || 'ERR04: 커서실행시 오류가 발생하여 종료됩니다.' ;
                         OUT_CNT := '0';
                         ROLLBACK;
                         RETURN;

                   END;
                 
                 
                  
                   OUT_MSG := '정상적으로 처리 되었습니다.' ;
                   OUT_CNT := R_CNT;
   
                   COMMIT;
                   --OUT_MSG := '실행되었습니다.' ;
                   --OUT_CNT := '1';
   
                   EXCEPTION WHEN OTHERS THEN 
                     OUT_MSG := SQLERRM || CHR(13) || 'ERR05: 실행중 알수없는 오류로 종료되었습니다.' ;
                     OUT_CNT := '0';
                     RETURN;

   END;

이 글에 대한 댓글이 총 1건 있습니다.

 반대 아닌가요?

 

가상계좌코드 채번을 하고 해당 계좌코드 사용 여부 (Y/N)을 업데이트 치지 않고 다시 Next 학번으로 루프가 돌게 되면 같은 번호가 따져서 insert 시 unique constraints에 걸려 오류가 납니다.

사용하였다고 update를 해줘야... 다른 계좌번호로 채번이 이루어지게 되니 무결성 이슈는 없겠죠.

 

 

혹시 이 배치가 동시에 여러개가 돌 수가 있나요?

아무거나님이 2011-11-03 14:45에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
39038터미널 동시 접속 시 쿼리가 느려지는 현상 [2]
장정
2011-11-02
4322
39037데이타가 손실되요 [1]
디비초보
2011-11-02
3557
39036GROUP BY 관련해서..2 [1]
카라
2011-11-02
4573
39035알수가 없네요 커서가 안닫히는.. [1]
지나
2011-11-02
5562
39034최대 보유수량 구하기? 쿼리도움부탁드려여 [5]
이종성
2011-11-02
4787
39033두칼럼사이의 값을 여려줄로 출력할떄.. 조언부탁드립니다. [1]
이경율
2011-11-02
4222
39032그룹함수 여러번 쓸때..
홍의명
2011-11-02
3795
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.036초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다