새벽 시간대에 잡을 돌려놓은 프로시저의 커서가 재대로 동작하지 않습니다. 0 7 1,471

by 데지아빠 [2015.01.21 09:02:24]


아침에 자동으로 도는 프로시저가 있는데요 

이게 새벽에 돌아갑니다. 

출근 전에요

그런데 이때 도는 프로시저가 문제가 있습니다.

구조는 

CREATE OR REPLACE PROCEDURE proc_11

is

변수선언

cursor c_11 is

select ~;

begin

open c_11;

loop

fetch c_11 into v_1, v_2;

exit when c_11%notfound;

begin

처리문

end;

end loop;

close c_11;

end;

 

요러한 구조로 되어있습니다. 

단순히 커서에 데이터를 select 해서 처리를 하는 프로시저인데요 이게 좀 황당한게

새벽에 돌때 커서에서 select가 안됩니다. ㅠㅠ

새벽시간데 일정 차수로 들어오는건데... 

1시에 1차, 4시에 2차 7시에 3차 이런식으로 data를 잘 가져옵니다. 

그런데 4시와 7시 사이 2차수로 select를 하면 커서로 데이터가 안 들어옵니다. 

프로시저 log 이력에서 에러메세지같은건 없구요 

그런데 아침에 8시에 출근해서 select 하면 커서로 데이터가 잡힙니다...

분명 매일 도는 프로시저인데... 가끔 안도니... 미치겠네요..

혹시 커서에서 가끔 안 잡히는 이유에 대해서 알고 계시는분 계신가요..ㅠ?

 

추가 내용입니다.

PROCEDURE PROC_MC_ZSD003_OLD_T 
IS
    log_program_id            VARCHAR2 (30);
    log_program_gubun        VARCHAR2 (12);
    log_source              VARCHAR2 (20);
    log_target              VARCHAR2 (20);
    log_start_date            VARCHAR2 ( 8);
    log_start_time            VARCHAR2 ( 6);
    log_error_row_id        VARCHAR2(200);
    log_error_desc            VARCHAR2(500);
    log_error_code            VARCHAR2 (30);
    log_source_count        NUMBER   (10);
    log_success_count        NUMBER   (10);
    log_error_count            NUMBER   (10);

    변수선언...

    cursor c_ORDERS IS
        Select ... 부분

BEGIN

    --------------------------------------------------------------
    -- log 변수 초기화
    --------------------------------------------------------------
    log_program_id    := 'PROC_MC_ZSD003_OLD_T';
    log_program_gubun := 'INTERFACE';
    log_source        := 'SOPROMISE';
    log_target        := 'ZSD003';
    log_start_date    := to_char(sysdate, 'yyyymmdd');
    log_start_time    := to_char(sysdate, 'hh24miss');
    log_source_count  := 0;
    log_success_count := 0;
    log_error_count   := 0;

    
    Open c_ORDERS;
    Loop
        Fetch c_ORDERS Into 변수...;
        Exit When c_ORDERS%NOTFOUND;

        begin
            log_error_row_id := v_PLNID || '|' || v_VBELN || '|' || v_POSNR  || '|' || v_SOPROMISEID;

            log_source_count := log_source_count + 1 ;
            

            처리부...

            --------------------------------------------------------------
            --  exception
            --------------------------------------------------------------
            Exception When OTHERS then
                log_error_code  := sqlcode;
                log_error_desc  := substr(sqlerrm,1,500);
                log_error_count := log_error_count + 1;
                pkg_mc_logger.write_error_log(log_program_id, log_program_gubun, log_source, log_target, log_start_date, log_start_time, log_error_row_id, log_error_desc,log_error_code);
                rollback;
            End;
    End Loop;

        누락처리...
        
    Close c_ORDERS;

    commit;

    --------------------------------------------------------------
    --  Job Log
    --------------------------------------------------------------
    pkg_mc_logger.write_log(log_program_id, log_program_gubun, log_source, log_target, log_start_date, log_start_time, to_char(sysdate, 'yyyymmdd'), to_char(sysdate, 'hh24miss'), 0, log_source_count, log_success_count, log_error_count);

END PROC_MC_ZSD003_OLD_T;

 

해당 프로시저는 pkg 안에 있는거라서요...

 

 

 

 

 

by jkson [2015.01.21 15:18:20]

커서에서 select 안 된다는 건 로그를 남긴 건가요? 아니면 job이 아예 안 돌아간 건지.. 이유 없이 데이터가 select 되지 않을 일은 없지요. job이 돌아간 게 확실하다면 select문에 뭔가 문제가 있거나 처리문에서 뭔가 오류가 있었는데 exception 처리가 잘 안 되어 오류 로그를 못 남겼거나 그런 문제겠지요.


by 데지아빠 [2015.01.21 16:01:24]

상세히는 안썻습니다. 

자체 로그를 남기는 기록이 있는데요 거기도 하나도 안남아서요.. 

해당 프로시저 좀더 디테일하게 올립니다.

회사에서 쓰는거라서.. 전체공개로 해도 되나 몰라서.. ㅠㅠ


by 데지아빠 [2015.01.21 16:03:40]

프로시저 수행 여부도 log 남기게 해놨구요. 

해당 커서가 몇번 돌았는지도 나오도록 log 해놨습니다.

그리고 에러 발생 시도 나오도록 되어있구요.. 그런대 새벽 새간대가 안 돌았는데.. 출근해서 검색해보면 나오니 미칠지경입니다. ㅠㅠ

매일 나오는 문제면 전체를 수정할텐데... 1달이나 가끔씩 나오는 문제는.... ㅠㅠ

이게 매일 돌아야 하는거라서... 에휴 확인이 잘 안되네요 ㅠㅠ


by jkson [2015.01.21 16:51:52]

프로시저도 돌았는데 커서 루프는 전혀 수행이 안 된 걸로 로그가 남았나보군요. 그러면 데이터 문제라고 밖에 생각이 안 되는데.. 프로시저가 돌아가는 시점으로 커서에 있는 select문을 돌려보셨나요? 출근 전에 뭔가 데이터 변화가 있었을 것 같은데요.. as of timestamp... 같은 걸로 커서 select문 다 바꿔놓고 쿼리 날려도 데이터 나오는지 확인해보세요.


by 데지아빠 [2015.01.21 17:53:52]

조회를 해보니 

[Error] Execution (87: 32): ORA-01555: 너무 이전 스냅샷:롤백 세그먼트 2 수에 "_SYSSMU2$" 이름으로 된 것이 너무 작습니다

 

는 글이 나옵니다. 너무 오래된 데이터라서 그런건지... 

지금은 확인이 안되네요... 아침에 바로 꼭 확인해봐야할것 같습니다.. 아침에도 이런 메세지 뜨면.. 밤새야 하나.. 고민입니다. ㅠㅠ


by jkson [2015.01.21 19:13:56]

아마 플래쉬백 시간이 지나서 그럴 거예요. 당일 아침에 확인하셔야할 겁니다. 추가) 지금 제가 확인해보니 시간이 지나버린 시점 데이터를 조회하면 'ORA-08180:지정된 시간에 준하여 스냅샷을 찾을 수 없음' 이라고 나오는데 ORA-01555는 다른 이유인가보네요. 혹시 한 시간 전 자료는 잘 조회되시나요?


by 데지아빠 [2015.02.10 11:26:39]

늦게 확인하여 죄송합니다. 요즘에 일이 많네요 한시간전 데이터는 조회가 잘 됩니다.

오래되니 안되는거네요..

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