연말정산 프로시져 중 에러내용인데 여러가지 수정을 해도 변화가 없어서 질문드립니다. 0 1 1,780

by 이종민 [DB 기타] [2013.02.18 23:06:13]


연말정산작업 끝나고 국세청에 전산매체자료 신고중인데 에러가 나와서요.
에러 내용이 E레코드가 없다는 내용입니다.
이유를 찾아보니 부양가족이 5명이하이면 문제없이 생성되는데
5명이 초과되면 저런 에러가 나옵니다.
E레코드가 5명까지 만들어주고 인원이 넘게되면 새로운 래코드를 만들어서 신고를 해야 하는데
이 부분에서 에러가 납니다.
레코드 자체가 생성이 되지 않았다고 하니 답답할 따름이네요.
작년과 비교해서 추가된 부분은 그닥 상관없는 부분이고 작년에는 프로그램상 잘 돌아가던 부분이라
더 답답합니다.
프로시져부분 소스 올리니 뭔가 이상한 점이나 의심가는 부분이 있다면 좀 부탁드립니다.

CREATE OR REPLACE PROCEDURE ERP.SA04150_P3
   (P_I_YEAR IN HU_YEAREND_M.I_YEAR%TYPE,
    P_I_DV    IN HU_YEAREND_M.I_DV%TYPE,
    P_I_EMP_NO    IN HU_YEAREND_M.I_EMP_NO%TYPE,
    P_NO IN NUMBER,    
    RETURN_TEXT   OUT VARCHAR2)
IS
 V_CHK    NUMBER(5)   := 0;
 V_CNT    NUMBER(5)   := 0;
 V_CNT2   NUMBER(5)   := 0;
 V_NO     NUMBER(6)   := 1;   /* 일련번호    */
 V_DATA_E     VARCHAR2(1330)   :='';   /* E레코드     */
 V_WHILE_CNT NUMBER(5)   := 1;   /* WHILE문 COUNT  */
 V_I_TAX_NO   CHAR(10)    :='';
 V_N_RSDT_NO CHAR(13)    :='';
 V_LEN    NUMBER(5)   := 0;  
 TS_PO    VARCHAR2(3) := 'E00';  /* ERROR POSITION */
 CHILD_CHK    NUMBER(5)   := 0;
 
 CURSOR C1 IS
   SELECT
    CNT, I_EMP_NO, I_REL,N_NAME,REL_N_RSDT_NO,Y_FRN ,Y_BASIC,Y_OBST,
    Y_CHILD_AD,
    Y_CHILD, Y_WOMAN, Y_OLD, Y_MANYCHILD, Y_INSU, Y_MED, Y_EDU, Y_CARD,W_INSU, W_MED, W_EDU, W_CARD, W_CHECK,
    W_CASH, W_GIFT, W_ETC_INSU, W_ETC_MED, W_ETC_EDU, W_ETC_CARD,W_ETC_CHECK,W_ETC_CASH,W_ETC_GIFT,
    W_MART, W_ETC_MART, W_ACDM
  FROM
  (
 SELECT
    ROWNUM CNT, I_EMP_NO, I_REL,N_NAME,REL_N_RSDT_NO,Y_FRN ,Y_BASIC,Y_OBST,
    Y_CHILD_AD,
    Y_CHILD, Y_WOMAN, Y_OLD, Y_MANYCHILD, Y_INSU, Y_MED, Y_EDU, Y_CARD,W_INSU, W_MED, W_EDU, W_CARD, W_CHECK,
    W_CASH, W_GIFT, W_ETC_INSU, W_ETC_MED, W_ETC_EDU, W_ETC_CARD,W_ETC_CHECK,W_ETC_CASH,W_ETC_GIFT,
    W_MART, W_ETC_MART, W_ACDM
  FROM
  (
  SELECT
   C.I_EMP_NO,
   F_COMMON_ETC1(C.I_REL) I_REL,
   C.N_NAME,
   C.N_RSDT_NO REL_N_RSDT_NO,
   C.Y_FRN ,
   DECODE(C.Y_BASIC,'Y','1',' ') Y_BASIC,
   DECODE(C.Y_OBST,'Y','1',' ') Y_OBST,
   DECODE(C.Y_CHILD,'Y','1',' ') Y_CHILD,
    DECODE(C.I_REL,'H90000',DECODE(A.Y_WOMAN,'Y','1',' '),' ') Y_WOMAN,
    CASE
   WHEN DECODE(SUBSTR(C.N_RSDT_NO,7,1),3,20,4,20,19)||SUBSTR(C.N_RSDT_NO,1,6) < SUBSTR(TO_CHAR(SYSDATE, 'YYYY')-71,1,4)||'1231' THEN --만70세 이상 --
    CASE
   WHEN C.Y_BASIC = 'Y' THEN '1'
   ELSE ' '
    END
   ELSE ' '
    END Y_OLD,
    DECODE(C.I_REL,'H90040',DECODE(C.Y_BASIC,'Y','1',' '),' ') Y_MANYCHILD,
    DECODE(C.Y_CHILD_AD,'Y','1',' ') Y_CHILD_AD, 
   C.Y_INSU,
   C.Y_MED,
   C.Y_EDU,
   C.Y_CARD, 
   NVL(A.W_PRE_MEDINSU, 0) + NVL(A.W_PRE_UEMPL_INSU, 0) + NVL(A.W_CUR_MEDINSU, 0) + NVL(A.W_CUR_UEMPL_INSU, 0)
   + NVL(B.W_INSU1, 0) + NVL(B.W_INSU2, 0) + NVL(B.W_OBST_INSU, 0) W_INSU,
   NVL(D.W_MED,0)W_MED,
   NVL(D.W_EDU,0)W_EDU,
   NVL(D.W_CARD,0)W_CARD,
   NVL(D.W_CHECK,0)W_CHECK,
   NVL(A.W_CASH,0)W_CASH,
   NVL(D.W_MART,0)W_MART,
   NVL(A.W_GIFT_GOV,0) + NVL(A.W_GIFT_50,0) + NVL(A.W_GIFT_30,0) + NVL(A.W_GIFT15,0) + NVL(A.W_GIFT_LBR,0) W_GIFT,
   NVL(D.W_ETC_INSU,0)W_ETC_INSU,
   NVL(D.W_ETC_MED,0)W_ETC_MED,
   NVL(D.W_ETC_EDU,0)W_ETC_EDU,
   NVL(D.W_ETC_CARD,0)W_ETC_CARD,
   NVL(D.W_ETC_CHECK,0)W_ETC_CHECK,
   NVL(D.W_ETC_CASH,0)W_ETC_CASH,
   NVL(B.W_ACDM,0)W_ACDM,
   NVL(D.W_ETC_MART,0)W_ETC_MART,
   NVL(D.W_ETC_GIFT,0)W_ETC_GIFT
  FROM HU_YEAREND_M A,
HU_YEARBASE_M B,
   HU_YEARFMLY_M C,
   HU_YEARFMLY_D D
WHERE A.I_EMP_NO  = B.I_EMP_NO
   AND B.I_EMP_NO  = C.I_EMP_NO
   AND C.I_EMP_NO  = D.I_EMP_NO(+)
   AND A.I_YEAR    = B.I_YEAR
   AND C.N_RSDT_NO = D.N_RSDT_NO(+)
   AND D.I_YEAR (+)   = P_I_YEAR
   AND A.I_YEAR    = P_I_YEAR   --2009.03.03 FCS 추가
   AND C.I_EMP_NO  = P_I_EMP_NO
   AND A.I_DV   IN (SELECT I_DV FROM CS_DIVISION_M WHERE N_AVT_RPT_DV =  P_I_DV)
   AND C.Y_SBTR = 'Y'
  ORDER BY I_REL
  )
 )
  WHERE CNT < 6    AND I_REL = 0
  UNION ALL
    SELECT
    CNT, I_EMP_NO, I_REL,N_NAME,REL_N_RSDT_NO,Y_FRN ,Y_BASIC,Y_OBST,
    Y_CHILD_AD,-- 2009.03.02 FCS 출산입양공제 추가
    Y_CHILD, Y_WOMAN, Y_OLD, Y_MANYCHILD, Y_INSU, Y_MED, Y_EDU, Y_CARD,W_INSU, W_MED, W_EDU, W_CARD, W_CHECK,
    W_CASH, W_GIFT, W_ETC_INSU, W_ETC_MED, W_ETC_EDU, W_ETC_CARD, W_ETC_CHECK,W_ETC_CASH,W_ETC_GIFT,
    W_MART, W_ETC_MART, W_ACDM
  FROM
  (
 SELECT
    ROWNUM CNT, I_EMP_NO, I_REL,N_NAME,REL_N_RSDT_NO,Y_FRN ,Y_BASIC,Y_OBST,
    Y_CHILD_AD,-- 2009.03.02 FCS 출산입양공제 추가
    Y_CHILD, Y_WOMAN, Y_OLD, Y_MANYCHILD, Y_INSU, Y_MED, Y_EDU, Y_CARD,W_INSU, W_MED, W_EDU, W_CARD, W_CHECK,
    W_CASH, W_GIFT, W_ETC_INSU, W_ETC_MED, W_ETC_EDU, W_ETC_CARD,W_ETC_CHECK,W_ETC_CASH,W_ETC_GIFT,
    W_MART, W_ETC_MART, W_ACDM
  FROM
  (
  SELECT
   C.I_EMP_NO,
   SUBSTR(C.I_REL,5,1) I_REL,
   C.N_NAME,
   C.N_RSDT_NO REL_N_RSDT_NO,
   C.Y_FRN ,
   DECODE(C.Y_BASIC,'Y','1',' ') Y_BASIC,
   DECODE(C.Y_OBST,'Y','1',' ') Y_OBST,
   DECODE(C.Y_CHILD,'Y','1',' ') Y_CHILD,
    DECODE(C.I_REL,'H90000',DECODE(A.Y_WOMAN,'Y','1',' '),' ') Y_WOMAN,
    CASE
   WHEN DECODE(SUBSTR(C.N_RSDT_NO,7,1),3,20,4,20,19)||SUBSTR(C.N_RSDT_NO,1,6) < SUBSTR(TO_CHAR(SYSDATE, 'YYYY')-71,1,4)||'1231' THEN --만70세 이상 --
    CASE
   WHEN C.Y_BASIC = 'Y' THEN '1'
   ELSE ' '
    END
   ELSE ' '
    END Y_OLD,
    DECODE(C.I_REL,'H90040',DECODE(C.Y_BASIC,'Y','1',' '),' ') Y_MANYCHILD,
    DECODE(C.Y_CHILD_AD,'Y','1',' ') Y_CHILD_AD, 
   C.Y_INSU,
   C.Y_MED,
   C.Y_EDU,
   C.Y_CARD, 
   NVL(D.W_INSU,0)W_INSU,
   NVL(D.W_MED,0)W_MED,
   NVL(D.W_EDU,0)W_EDU,
   NVL(D.W_CARD,0)W_CARD,
   NVL(D.W_CHECK,0)W_CHECK, 
   NVL(D.W_MART,0)W_MART,
   NVL(D.W_CASH,0)W_CASH,
   NVL(D.W_GIFT,0)W_GIFT,
   NVL(D.W_ETC_INSU,0)W_ETC_INSU,
   NVL(D.W_ETC_MED,0)W_ETC_MED,
   NVL(D.W_ETC_EDU,0)W_ETC_EDU,
   NVL(D.W_ETC_CARD,0)W_ETC_CARD,
   NVL(D.W_ETC_CHECK,0)W_ETC_CHECK,
   NVL(D.W_ETC_MART,0)W_ETC_MART,
   NVL(D.W_ETC_CASH,0)W_ETC_CASH,
   NVL(D.W_ETC_GIFT,0)W_ETC_GIFT,
   NVL(B.W_ACDM,0)W_ACDM
  FROM HU_YEAREND_M A,
   HU_YEARBASE_M B,
   HU_YEARFMLY_M C,
   HU_YEARFMLY_D D
WHERE A.I_EMP_NO  = C.I_EMP_NO
   AND C.I_EMP_NO  = D.I_EMP_NO(+)
   AND C.N_RSDT_NO = D.N_RSDT_NO(+)
   AND D.I_YEAR (+)   = P_I_YEAR
   AND A.I_YEAR    = P_I_YEAR   --2009.03.03 FCS 추가
   AND C.I_EMP_NO  = P_I_EMP_NO
   AND A.I_DV   IN (SELECT I_DV FROM CS_DIVISION_M WHERE N_AVT_RPT_DV =  P_I_DV)
   AND C.Y_SBTR = 'Y'
  ORDER BY I_REL
  )
 )
  WHERE CNT < 6 AND I_REL <> 0 ;   

-- 5명 초과시

 CURSOR C2 IS
  SELECT
    CNT, I_EMP_NO, I_REL,N_NAME,REL_N_RSDT_NO,Y_FRN ,Y_BASIC,Y_OBST,
    Y_CHILD_AD,-- 2009.03.02 FCS 출산입양공제 추가
    Y_CHILD, Y_WOMAN, Y_OLD, Y_MANYCHILD, Y_INSU, Y_MED, Y_EDU, Y_CARD,W_INSU, W_MED, W_EDU, W_CARD, W_CHECK,
    W_CASH, W_GIFT, W_ETC_INSU, W_ETC_MED, W_ETC_EDU, W_ETC_CARD,W_ETC_CHECK,W_ETC_CASH,W_ETC_GIFT,
    W_MART, W_ETC_MART, W_ACDM
  FROM
  (
 SELECT
    ROWNUM CNT, I_EMP_NO, I_REL,N_NAME,REL_N_RSDT_NO,Y_FRN ,Y_BASIC,Y_OBST,
    Y_CHILD_AD,-- 2009.03.02 FCS 출산입양공제 추가
    Y_CHILD, Y_WOMAN, Y_OLD, Y_MANYCHILD,  Y_INSU, Y_MED, Y_EDU, Y_CARD,W_INSU, W_MED, W_EDU, W_CARD,W_CHECK,
    W_CASH, W_GIFT, W_ETC_INSU, W_ETC_MED, W_ETC_EDU, W_ETC_CARD,W_ETC_CHECK,W_ETC_CASH,W_ETC_GIFT,
    W_MART, W_ETC_MART, W_ACDM
  FROM
  (
  SELECT
   C.I_EMP_NO,
   SUBSTR(C.I_REL,5,1) I_REL,
   C.N_NAME,
   C.N_RSDT_NO REL_N_RSDT_NO,
   C.Y_FRN ,
   DECODE(C.Y_BASIC,'Y','1',' ') Y_BASIC,
   DECODE(C.Y_OBST,'Y','1',' ') Y_OBST,
   DECODE(C.Y_CHILD,'Y','1',' ') Y_CHILD,
    DECODE(C.I_REL,'H90000',DECODE(A.Y_WOMAN,'Y','1',' '),' ') Y_WOMAN,
    CASE
   WHEN DECODE(SUBSTR(C.N_RSDT_NO,7,1),3,20,4,20,19)||SUBSTR(C.N_RSDT_NO,1,6) < SUBSTR(TO_CHAR(SYSDATE, 'YYYY')-66,1,4)||'1231' THEN --만65세 이상 --
    CASE
   WHEN C.Y_BASIC = 'Y' THEN '1'
   ELSE ' '
    END
   ELSE ' '
    END Y_OLD,
    DECODE(C.I_REL,'H90040',DECODE(C.Y_BASIC,'Y','1',' '),' ') Y_MANYCHILD,
    DECODE(C.Y_CHILD_AD,'Y','1',' ') Y_CHILD_AD,  -- 2009.03.02 FCS 출산입양공제 추가
   C.Y_INSU,
   C.Y_MED,
   C.Y_EDU,
   C.Y_CARD,
   NVL(D.W_INSU,0)W_INSU,
   NVL(D.W_MED,0)W_MED,
   NVL(D.W_EDU,0)W_EDU,
   NVL(D.W_CARD,0)W_CARD,
   NVL(D.W_CHECK,0)W_CHECK,
   NVL(D.W_MART,0)W_MART,
   NVL(D.W_CASH,0)W_CASH,
   NVL(D.W_GIFT,0)W_GIFT,
   NVL(D.W_ETC_INSU,0)W_ETC_INSU,
   NVL(D.W_ETC_MED,0)W_ETC_MED,
   NVL(D.W_ETC_EDU,0)W_ETC_EDU,
   NVL(D.W_ETC_CARD,0)W_ETC_CARD,
   NVL(D.W_ETC_CHECK,0)W_ETC_CHECK,
   NVL(D.W_ETC_MART,0)W_ETC_MART,
   NVL(D.W_ETC_CASH,0)W_ETC_CASH,
   NVL(D.W_ETC_GIFT,0)W_ETC_GIFT,
   NVL(B.W_ACDM,0)W_ACDM
  FROM HU_YEAREND_M A,
   HU_YEARBASE_M B,
   HU_YEARFMLY_M C,
   HU_YEARFMLY_D D
  
WHERE A.I_EMP_NO  = C.I_EMP_NO
   AND C.I_EMP_NO  = D.I_EMP_NO(+)
   AND C.N_RSDT_NO = D.N_RSDT_NO(+)
   AND D.I_YEAR(+)    = P_I_YEAR
   AND A.I_YEAR    = P_I_YEAR   --2009.03.03 FCS 추가
   AND C.I_EMP_NO  = P_I_EMP_NO
   AND A.I_DV   IN (SELECT I_DV FROM CS_DIVISION_M WHERE N_AVT_RPT_DV =  P_I_DV)
   AND C.Y_SBTR = 'Y'
  ORDER BY I_REL
  )
 )
  WHERE CNT > 5;
  
-- 레코드 생성 부분
BEGIN

  TS_PO := 'E00';  /* 레코드생성 */
    SELECT I_TAX_NO, N_RSDT_NO
  INTO V_I_TAX_NO, V_N_RSDT_NO
  FROM HU_PSN_M A,
   CS_DIVISION_M B,
   HU_YEAREND_M C
WHERE C.I_DV = B.I_DV
   AND A.I_EMP_NO = C.I_EMP_NO
   AND C.I_YEAR   = P_I_YEAR  --2009.03.02 FCS
   AND A.I_EMP_NO = P_I_EMP_NO;
 
    V_DATA_E := NULL;
    V_DATA_E := 'E';    --레코드 구분(1)
    V_DATA_E := SUBSTRB(V_DATA_E, 1,   1) || '20'; --자료구분(2)
    V_DATA_E := SUBSTRB(V_DATA_E, 1,   3) || SUBSTR(V_I_TAX_NO,1,3);    --세무서(3)
    V_DATA_E := SUBSTRB(V_DATA_E, 1,   6) || LPAD(TO_CHAR(TO_NUMBER(P_NO)),6,'0');     --일련번호(6)
    /* 원천징수의무자 */
    V_DATA_E := SUBSTRB(V_DATA_E, 1,  12) || LPAD(V_I_TAX_NO,10,' ');    --사업자등록번호(10)    
    /* 소득자(근로자) */
    V_DATA_E := SUBSTRB(V_DATA_E, 1,  22) || LPAD(V_N_RSDT_NO,13,' ');   --주민등록번호(13)
    V_LEN    := LENGTH(V_DATA_E);
  TS_PO := 'E01';  /* 레코드생성 */
 
 
    SELECT SUM(DECODE(C.I_REL,'H90040',DECODE(C.Y_BASIC,'Y',1,0),0)) Y_MANYCHILD_CHK
  INTO CHILD_CHK
  FROM HU_YEAREND_M A,
   HU_YEARFMLY_M C,
   HU_YEARFMLY_D D
WHERE A.I_EMP_NO  = C.I_EMP_NO
   AND C.I_EMP_NO  = D.I_EMP_NO(+)
   AND C.N_RSDT_NO = D.N_RSDT_NO(+)
   AND D.I_YEAR(+) = P_I_YEAR
   AND C.I_EMP_NO  = P_I_EMP_NO
   AND A.I_DV   IN (SELECT I_DV FROM CS_DIVISION_M WHERE N_AVT_RPT_DV =  P_I_DV);
 
 
FOR R1 IN C1 LOOP
    /* 소득공제명세1의 인적사항 */
    V_DATA_E := V_DATA_E || LPAD(R1.I_REL,1,' ');    --관계(1)
    V_DATA_E := V_DATA_E || LPAD(R1.Y_FRN,1,' ');    --내외국인구분코드(1)
    V_DATA_E := V_DATA_E || LPAD(R1.N_NAME,20,' '); --성명(20)
    V_DATA_E := V_DATA_E || LPAD(R1.REL_N_RSDT_NO,13,' ');   --주민등록번호(13)
    V_DATA_E := V_DATA_E || LPAD(R1.Y_BASIC,1,' '); --기본공제(1)
    V_DATA_E := V_DATA_E || LPAD(R1.Y_OBST,1,' ');   --장애인(1)
    V_DATA_E := V_DATA_E || LPAD(R1.Y_CHILD,1,' '); --자녀양육비(1)
    V_DATA_E := V_DATA_E || LPAD(R1.Y_WOMAN,1,' '); --부녀자(1)
    V_DATA_E := V_DATA_E || LPAD(R1.Y_OLD,1,' '); --경로우대(1)
    V_DATA_E := V_DATA_E || LPAD(R1.Y_CHILD_AD,1,' '); --출산입양자공제(1) 
    /* 소득공제명세1의 국세청자료 공제금액 */
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R1.W_INSU),10,'0');     --보험료(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R1.W_MED),10,'0'); --의료비(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R1.W_EDU),10,'0'); --교육비(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R1.W_CARD),10,'0');     --신용카드 등(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R1.W_CHECK),10,'0');    --직불카드 등(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R1.W_CASH),10,'0');     --현금영수증(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R1.W_MART),10,'0');     --전통시장(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R1.W_GIFT),13,'0');     --기부금(13)
    /* 소득공제명세1의 국세청자료 이외의 공제금액 */
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R1.W_ETC_INSU),10,'0');     --보험료외(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R1.W_ETC_MED),10,'0'); --의료비외(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R1.W_ETC_EDU),10,'0'); --교육비외(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R1.W_ETC_CARD),10,'0');     --신용카드 등외(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R1.W_ETC_CHECK),10,'0');    --직불카드 등외(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R1.W_ACDM),10,'0');     --학원비지로납부액(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R1.W_ETC_MART),10,'0');     --전통시장 사용액외(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R1.W_ETC_GIFT),13,'0');     --기부금(13)
    V_WHILE_CNT := V_WHILE_CNT + 1;
END LOOP;
  V_LEN    := LENGTH(V_DATA_E);
    /* 소득공제명세2의 인적사항 */
  WHILE V_WHILE_CNT < 6 LOOP
    V_DATA_E := V_DATA_E || LPAD(' ',1,' ');    --관계(1)
    V_DATA_E := V_DATA_E || LPAD(' ',1,' ');    --내외국인구분코드(1)
    V_DATA_E := V_DATA_E || LPAD(' ',20,' ');   --성명(20)
    V_DATA_E := V_DATA_E || LPAD(' ',13,' ');   --주민등록번호(13)
    V_DATA_E := V_DATA_E || LPAD(' ',1,' ');    --기본공제(1)
    V_DATA_E := V_DATA_E || LPAD(' ',1,' ');    --장애인(1)
    V_DATA_E := V_DATA_E || LPAD(' ',1,' ');    --자녀양육비(1)
    V_DATA_E := V_DATA_E || LPAD(' ',1,' '); --부녀자(1)
    V_DATA_E := V_DATA_E || LPAD(' ',1,' '); --경로우대(1)
    V_DATA_E := V_DATA_E || LPAD(' ',1,' '); --출산입양자공제(1) 
   /* 소득공제명세2의 국세청자료 공제금액 */  
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --보험료(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --의료비(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --교육비(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --신용카드 등(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --직불카드 등(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --현금영수증(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --전통시장(10)
    V_DATA_E := V_DATA_E || LPAD('0',13,'0');   --기부금(13)
    /* 소득공제명세2의 국세청자료 이외의 공제금액 */   
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --보험료외(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --의료비외(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --교육비외(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --신용카드 등외(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --직불카드 등외(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --학원비지로납부액(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --전통시장 등외(10)
    V_DATA_E := V_DATA_E || LPAD('0',13,'0');   --기부금(13)
    V_LEN    := LENGTH(V_DATA_E);
    V_WHILE_CNT := V_WHILE_CNT + 1;
  END LOOP;

 
    V_LEN    := LENGTH(V_DATA_E);   
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(TO_NUMBER(V_NO)),2,'0');    --일련번호(2)
    V_NO := V_NO+1;
    V_DATA_E := V_DATA_E || LPAD(' ',258,' ');    --공란(2)
   
   
   
   
    SELECT COUNT(O_SEQ)
  INTO V_CHK
  FROM HU_YEARREC_M
WHERE I_YEAR = P_I_YEAR
   AND I_DV   = P_I_DV
   AND I_EMP_NO = P_I_EMP_NO
   AND I_REC_GBN = 'E';
   
    IF V_CHK > 0 THEN
  DELETE HU_YEARREC_M WHERE I_YEAR = P_I_YEAR AND I_DV = P_I_DV AND I_EMP_NO = P_I_EMP_NO AND I_REC_GBN = 'E';
    ELSE  
  SELECT MAX(O_SEQ)
    INTO V_CNT
    FROM HU_YEARREC_M
   WHERE I_YEAR = P_I_YEAR
AND I_DV   = P_I_DV;
   
  INSERT INTO HU_YEARREC_M ( I_YEAR,   I_DV,   O_SEQ, I_REC_GBN, I_EMP_NO,    N_REC )
    VALUES ( P_I_YEAR, P_I_DV, V_CNT + 1, 'E',    P_I_EMP_NO, V_DATA_E );
    END IF;  
--5명이 초과 되면 생성되는 레코드

    SELECT COUNT(A.I_EMP_NO)
  INTO V_CNT2
  FROM HU_YEAREND_M A,
   HU_YEARFMLY_M C,
   HU_YEARFMLY_D D
WHERE A.I_EMP_NO  = C.I_EMP_NO
   AND C.I_EMP_NO  = D.I_EMP_NO(+)
   AND C.N_RSDT_NO = D.N_RSDT_NO(+)
   AND D.I_YEAR(+)    = P_I_YEAR
   AND A.I_YEAR    = P_I_YEAR
   AND C.I_EMP_NO  = P_I_EMP_NO
   AND A.I_DV   IN (SELECT I_DV FROM CS_DIVISION_M WHERE N_AVT_RPT_DV =  P_I_DV);
   
    IF V_CNT2 > 5 THEN
    V_DATA_E := NULL;
    V_DATA_E := 'E';    --레코드 구분(1)
    V_DATA_E := SUBSTRB(V_DATA_E, 1,   1) || '20'; --자료구분(2)
    V_DATA_E := SUBSTRB(V_DATA_E, 1,   3) || SUBSTR(V_I_TAX_NO,1,3);    --세무서(3)
    V_DATA_E := SUBSTRB(V_DATA_E, 1,   6) || LPAD(TO_CHAR(TO_NUMBER(P_NO)),6,'0');     --일련번호(6)
    /* 원천징수의무자 */
    V_DATA_E := SUBSTRB(V_DATA_E, 1,  12) || LPAD(V_I_TAX_NO,10,' ');    --사업자등록번호(10)    
    /* 소득자(근로자) */
    V_DATA_E := SUBSTRB(V_DATA_E, 1,  22) || LPAD(V_N_RSDT_NO,13,' ');   --주민등록번호(13)
    V_LEN    := LENGTH(V_DATA_E);
    V_WHILE_CNT := 1;
FOR R2 IN C2 LOOP
    /* 소득공제명세1의 인적사항 */
    V_DATA_E := V_DATA_E || LPAD(R2.I_REL,1,' ');    --관계(1)
    V_DATA_E := V_DATA_E || LPAD(R2.Y_FRN,1,' ');    --내외국인구분코드(1)
    V_DATA_E := V_DATA_E || LPAD(R2.N_NAME,20,' '); --성명(20)
    V_DATA_E := V_DATA_E || LPAD(R2.REL_N_RSDT_NO,13,' ');   --주민등록번호(13)
    V_DATA_E := V_DATA_E || LPAD(R2.Y_BASIC,1,' '); --기본공제(1)
    V_DATA_E := V_DATA_E || LPAD(R2.Y_OBST,1,' ');   --장애인(1)
    V_DATA_E := V_DATA_E || LPAD(R2.Y_CHILD,1,' '); --자녀양육비(1)
    V_DATA_E := V_DATA_E || LPAD(R2.Y_WOMAN,1,' '); --부녀자(1)
    V_DATA_E := V_DATA_E || LPAD(R2.Y_OLD,1,' '); --경로우대(1)
    V_DATA_E := V_DATA_E || LPAD(R2.Y_CHILD_AD,1,' '); --출산입양자공제(1) 
    /* 소득공제명세1의 국세청자료 공제금액 */
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R2.W_INSU),10,'0');     --보험료(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R2.W_MED),10,'0'); --의료비(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R2.W_EDU),10,'0'); --교육비(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R2.W_CARD),10,'0');     --신용카드 등(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R2.W_CHECK),10,'0');    --직불카드 등(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R2.W_CASH),10,'0');     --현금영수증(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R2.W_MART),10,'0');     --전통시장(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R2.W_GIFT),13,'0');     --기부금(13)
    /* 소득공제명세1의 국세청자료 이외의 공제금액 */
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R2.W_ETC_INSU),10,'0');     --보험료외(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R2.W_ETC_MED),10,'0'); --의료비외(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R2.W_ETC_EDU),10,'0'); --교육비외(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R2.W_ETC_CARD),10,'0');     --신용카드 등외(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R2.W_ETC_CHECK),10,'0');    --직불카드 등외(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R2.W_ACDM),10,'0');     --학원비지로(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R2.W_ETC_MART),10,'0');     --전통시장 등외(10)
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(R2.W_ETC_GIFT),13,'0');     --기부금(13)
    V_WHILE_CNT := V_WHILE_CNT + 1;
END LOOP;
 
  WHILE V_WHILE_CNT < 6 LOOP
    V_DATA_E := V_DATA_E || LPAD(' ',1,' ');    --관계(1)
    V_DATA_E := V_DATA_E || LPAD(' ',1,' ');    --내외국인구분코드(1)
    V_DATA_E := V_DATA_E || LPAD(' ',20,' ');   --성명(20)
    V_DATA_E := V_DATA_E || LPAD(' ',13,' ');   --주민등록번호(13)
    V_DATA_E := V_DATA_E || LPAD(' ',1,' ');    --기본공제(1)
    V_DATA_E := V_DATA_E || LPAD(' ',1,' ');    --장애인(1)
    V_DATA_E := V_DATA_E || LPAD(' ',1,' ');    --자녀양육비(1)
    V_DATA_E := V_DATA_E || LPAD(' ',1,' '); --부녀자(1)
    V_DATA_E := V_DATA_E || LPAD(' ',1,' '); --경로우대(1)
    V_DATA_E := V_DATA_E || LPAD(' ',1,' '); --출산입양자공제(1) 
    /* 소득공제명세1의 국세청자료 공제금액 */  
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --보험료(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --의료비(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --교육비(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --신용카드 등(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --직불카드 등(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --현금영수증(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --전통시장(10)
    V_DATA_E := V_DATA_E || LPAD('0',13,'0');   --기부금(13)
    /* 소득공제명세1의 국세청자료 이외의 공제금액 */   
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --보험료외(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --의료비외(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --교육비외(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --신용카드 등외(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --직불카드 등외(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --학원비지로(10)
    V_DATA_E := V_DATA_E || LPAD('0',10,'0');   --전통시장 등외(10)
    V_DATA_E := V_DATA_E || LPAD('0',13,'0');   --기부금(13)
    V_LEN    := LENGTH(V_DATA_E);
    V_WHILE_CNT := V_WHILE_CNT + 1;
  END LOOP;
    V_LEN    := LENGTH(V_DATA_E);   
    V_DATA_E := V_DATA_E || LPAD(TO_CHAR(TO_NUMBER(V_NO)),2,'0');    --일련번호(2)
    V_NO := V_NO+1;
    V_DATA_E := V_DATA_E || LPAD(' ',258,' ');    --공란(2)
   
    SELECT COUNT(O_SEQ)
  INTO V_CHK
  FROM HU_YEARREC_M
WHERE I_YEAR = P_I_YEAR
   AND I_DV   = P_I_DV
   AND I_EMP_NO = P_I_EMP_NO
   AND I_REC_GBN = 'E';
   
  SELECT MAX(O_SEQ)
    INTO V_CNT
    FROM HU_YEARREC_M
   WHERE I_YEAR = P_I_YEAR
AND I_DV   = P_I_DV;
   
  INSERT INTO HU_YEARREC_M ( I_YEAR,   I_DV,   O_SEQ, I_REC_GBN, I_EMP_NO,    N_REC )
    VALUES ( P_I_YEAR, P_I_DV, V_CNT + 1, 'E',    P_I_EMP_NO, V_DATA_E );
 
    END IF;
 
  COMMIT;
  RETURN_TEXT := '0';
 
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
    ROLLBACK;
    RETURN_TEXT := TS_PO || ':' || SQLERRM;
 
  WHEN OTHERS THEN
    ROLLBACK;
    RETURN_TEXT := TS_PO || ':' || SQLERRM; 
   
END  SA04150_P3 ;
/

by 부쉬맨 [2013.02.19 09:10:48]
1) 저런에러의정체? TS_PO 의 위치가 어디에서나는건지???

2) 개인적으로 좋아하지않은 프로시저 이유는 cursor는 무조건 5인이하, 초과 다 돈다 때문에 속도가 느려진다
   이건 if 상수로 받아서 이하일때, 초과일때 만 도는 프로시저로 변경해야되지않을까요?

3) 이건 답이없을꺼같네요 테스트용 프로시저하나만들어서 5명초과시에 들어가는 부분에 대해서 디버깅을 한다든지 테스트를 해봐야지 알수가있을꺼같네요. output 파라미터를 잘사용하면 쉽습니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입