오라클 프로시저 내 INSERT, UPDATE 구문 실행 문제입니다. 0 2 4,038

by kclover [PL/SQL] 프로시저 SQL COMMIT PL/SQL [2018.04.27 14:10:24]


안녕하세요.

다름이 아니라 잡으로 프로시저를 실행 하는데 문제가 발생 되서 질문드립니다.

평상 시에는 정상 동작 하는데, DB 교체 작업을 할 때(신규 서버에 DB 복제했습니다.)

발생 했더라구요. 이런 문제가 발생 되지않게 하려면 어떻게 해야할까요?

 

- 환경 설명

  1. DB서버 2대 입니다. 둘다 오라클 이구요

  2. 1번 서버에는 신청 데이터가 쌓입니다. 2번 서버에서는 잡으로 1번 서버 데이터를 하나씩 처리

      합니다.

  3. 2번 서버에서 1번 서버 참조가 가능하여 처리된 데이터도 처리 했다고 마킹 합니다.

 

 - 문제 

     2번 서버에서 잡으로 돌리는 프로시저 내에서 데이터로 각기 다른 테이블에 새로이 행을 추가하기도 하고, 업데이트를 하기도 합니다. 그런데! 이 부분이 실행되지 않고, 신청 데이터 처리를 완료 했다고 마킹이 되는 문제가 발생 했습니다.

 

 - 소스 코드 예시 대략적인 내용입니다.

 

CREATE OR REPLACE PROCEDURE TEST.EXAMPLE_PRC
(   
  YN_REG  IN VARCHAR2
)     
AS

BEGIN
     

     1. YN_REG -> N으로 되어있는(등록 안된) 행 중 제일 일찍 들어온 데이터 추출

     2. 데이터가 신청/갱신/해지 종류에 따라 신청 내역 INSERT INTO LIST ~~~   // 진행 안된 부분

     3. 고객에 대한 마스터 데이터 UPDATE CUST_DATA ~~~~ (신청/갱신/해지)  // 진행 안된 부분

     4. 1번 서버 신청데이터 등록 처리 UPDATE CUST_REQ@DB2                      // 등록 처리 됨


     COMMIT;
 
EXCEPTION
    WHEN OTHERS
    THEN
    RAISE_APPLICATION_ERROR(-20001, 'EXAMPLE_PRC' || SQLERRM);
 
END EXAMPLE_PRC;
/

by 마농 [2018.04.27 14:41:11]

에러는 사소한 곳에서 발생됩니다.
사소한 부분이라 직접 개발자는 못보고 지나치기 쉽습니다.
옆 사람이 보면 금방 발견되기도 하구요.
소스 안올려 주실거면 왜 질문 하셨는지 모르겠네요?
디버깅 해가면서 스스로 찾아 내셔야 합니다.
막연한 생각으로는 중간에 조건이 맞지 않는 부분이 있어서 처리가 안되었을 듯 하네요.


by kclover [2018.04.27 14:59:08]

음. 죄송합니다. 제가 생각이 좀 짧았네요. 소스코드를 다 올릴 수는 없을거 같아서 예시로만 올렸습니다. ㅠㅠ.. 의견 감사합니다!

저도 디버깅을 마치고 다른 분들이랑 나눠봤는데 들어온 데이터와 분기 나누어지는 부분은 이상이 없는걸 몇번이나 재차 확인했습니다. 특별한 작업이 아니라 1번 디비에 들어온 데이터를 2번 디비에 저장하고, 1번 디비 데이터에 체크 해주는 것이 다인 작업이었습니다.

체크는 되었지만 입력 되지 않은 데이터를 확인하고 다시 체크 해제해서 잡으로 실행되게 만들면 이상없이 데이터 들어가는 것도 확인 했습니다. 그래서 PL/SQL에는 문제가 없다고 생각하여 예시로 올린거였구요.. ㅠ_ㅠㅋ

나중에 질문글을 조금 수정하였습니다. 제 생각으로는 2번 DB서버 교체 작업 시에 들어온 데이터에 문제가 있는 것으로 추정하고 있습니다. 리스너 및 DB 내리는 작업 도중에 문제가 생긴건가 라고 생각만 할 뿐입니다.

그래서 혹시 저와 비슷한 경험을 하신 분이나 프로시저 내 트랜잭션 처리가 마쳤을 때 한번에 할 수 있는 방법이 있나 확인해보고자 질문 드렸습니다. 프로시저 BEGIN-END나 COMMIT이 중요할까 싶어서 코드도 올렸구요. 

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