정상적으로 작업수행후
커서가 닫히지 않고 다시 돕니다..결국 무결성에러
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; |