루프 질문드립니다. 0 3 688

by 봉구 [Oracle 기초] 루프.오라클 [2018.07.06 11:41:16]


 begin
  for i in (select K.RSVNUM,K.RSVINFO_ID FROM EXPRSVINFO K,EXPRSVSCHE T
            WHERE 1=1
            AND   T.EXPMETR_ID = K.EXPMETR_ID  -- 키
            AND   T.RSVDATE = K.RSVDATE -- 키 
            AND   T.RSV_STR_TIME = K.RSV_STR_TIME -- 키
            AND   T.RSV_END_TIME = K.RSV_END_TIME -- 키
            AND   RSVSTATE = '5' 
            AND   APPLYDATE+3 < sysdate
            ORDER BY K.RSVDATE ASC
          )
  loop
    UPDATE EXPRSVSCHE Z
        SET RSVNUM = RSVNUM - I.RSVNUM
     WHERE EXISTS
           (SELECT 
           K.RSVINFO_ID
           ,K.RSVDATE
        FROM EXPRSVINFO K
        WHERE     Z.EXPGOOD_ID = K.EXPGOOD_ID
            AND   Z.EXPMETR_ID = K.EXPMETR_ID
            AND   Z.RSVDATE = K.RSVDATE
            AND   Z.RSV_STR_TIME = K.RSV_STR_TIME
            AND   Z.RSV_END_TIME = K.RSV_END_TIME
            AND   K.RSVINFO_ID = I.RSVINFO_ID   --예약 pk값
            AND   K.RSVSTATE = '5'
            AND   K.APPLYDATE+3 < sysdate
            ); 
      
  end loop;
end;     

 예약이 3일후 입금확인이 안되면 자동 취소되는 프로시저를 만들었습니다.

그 상태값을 가지고 현재 3일이 지나면 자동취소 되는 인원들을 하나씩 

업데이트 쳐주고 싶은데 스케쥴 테이블에 있는 인원에 예약한 인원을 (-)빼서 그 인원이 사라지게 하고싶은데 

현재 이렇게 돌리면 순차적으로 삭제되는게 아니라 랜덤으로 4행 삭제가 되버립니다.

예를 들어 20 30 40 50 명 이렇게 인원이 예약되있는데 ㅡ 빼야하는 인원이 4행이 맘대로 빼져서

맞지않습니다.

잘못짠거 같은데..뭔가 해결책이 안떠올라서 문의드립니다.

제가 여기에 처음으로 글을 쓰고 초보라서 많이 부족합니다.EXPGOOD_ID ,EXPMETR,RSVDATE,RSV_STR_TIME,RSV_END_TIME

가 외래키로  기존 설계테이블에 설정되어있고

예약 테이블은 저 5개로 예약을 매칭해서 찾는데 

저 밑에있는 예약 테이블 인원을 스케쥴테이블에 차감해서 (-)빼서 업데이트를 쳐줄려고 하는건데.

RSVSTATE = '5' 예약테이블 상태값으로 3일지난 입금확인안된 예약들이 배치돌아서 변경되어지는 값

화면상에 예약인원 20명/정원50명 이 예약하신분이 20명 이라면 입금을 3일동안 안하시면 자동으로 지금 등록된 20명이 0명이되게 현재 예약테이블에

차감해서 업데이트를 하고싶습니다.   

by 마농 [2018.07.06 13:08:56]

예약 취소 처리 방법이 이상하네요.
SET RSVNUM = RSVNUM - I.RSVNUM
이게 예약 취소인가요? 이건 뭔가 아닌 듯 합니다.
예약 취소 처리 방법을 명확하게 해야 할 것 같습니다.
각 테이블의 역할과 키컬럼, 중요 컬럼에 대한 설명을 해주세요.


by 마농 [2018.07.06 14:04:44]
BEGIN
    FOR i IN (SELECT k.rsvinfo_id
                   , k.rsvnum
                   , k.expgood_id  
                   , k.expmetr_id  
                   , k.rsvdate     
                   , k.rsv_str_time
                   , k.rsv_end_time
                FROM exprsvsche z
                   , exprsvinfo k
               WHERE k.expgood_id   = z.expgood_id
                 AND k.expmetr_id   = z.expmetr_id
                 AND k.rsvdate      = z.rsvdate
                 AND k.rsv_str_time = z.rsv_str_time
                 AND k.rsv_end_time = z.rsv_end_time
                 AND k.rsvstate     = '5' 
                 AND k.applydate    < sysdate - 3
              )
    LOOP
        UPDATE exprsvsche z
           SET z.rsvnum = z.rsvnum - i.rsvnum
         WHERE z.expgood_id   = i.expgood_id
           AND z.expmetr_id   = i.expmetr_id
           AND z.rsvdate      = i.rsvdate
           AND z.rsv_str_time = i.rsv_str_time
           AND z.rsv_end_time = i.rsv_end_time
        ;
    END LOOP;
END;
/
BEGIN
    FOR i IN (SELECT k.rsvnum
                   , z.ROWID rid
                FROM exprsvsche z
                   , exprsvinfo k
               WHERE k.expgood_id   = z.expgood_id
                 AND k.expmetr_id   = z.expmetr_id
                 AND k.rsvdate      = z.rsvdate
                 AND k.rsv_str_time = z.rsv_str_time
                 AND k.rsv_end_time = z.rsv_end_time
                 AND k.rsvstate     = '5' 
                 AND k.applydate    < sysdate - 3
              )
    LOOP
        UPDATE exprsvsche z
           SET z.rsvnum = z.rsvnum - i.rsvnum
         WHERE z.ROWID  = i.rid
        ;
    END LOOP;
END;
/

 


by 봉구 [2018.07.06 14:17:31]

정말감사합니다. 마농님 정말 감사합니다. ROWID를 사용하면되는군요

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입