2014-04-10 4 views
0

Oracle 데이터베이스의 일부 임시 테이블에서 테이블에 데이터를 삽입하는 저장 프로 시저가 있습니다. 특정 검사를 기반으로 동일한 테이블의 플래그를 업데이트하는 삽입 후 update 문이 있습니다. 스토어드 프로 시저가 끝나면 커밋이 발생합니다. 문제는 업데이트가 95 %의 경우에 작동하지만 일부 경우 업데이트가 실패한다는 것입니다. 우리는 아무 것도 바꾸지 않고 다시 실행하려고 할 때 작동합니다. 심지어 다른 시간에 동일한 데이터에 대해 동일한 저장 프로 시저를 실행하려고해도 완벽하게 작동합니다. 저장 프로 시저의 논리에서 문제를 발견하지 못했습니다. 우리가 찾을 수없는 데이터베이스 수준의 문제가 있다고 생각합니다. (아마도 동시성과 관련이 있습니다). 이것에 대한 아이디어는 매우 도움이 될 것입니다.Oracle - 저장 프로 시저의 업데이트 문이 한 번 작동하지 않습니다

+0

데이터베이스의 동시성은 두 개의 검입니다. Chris가 지적했듯이 오류를 기록하는 절차에 예외를 추가하면 확실히 도움이됩니다. 다중 사용자 환경을 개발할 때 필요한 몇 가지 사항이 있습니다. [분실 된 업데이트] (http://tkyte.blogspot.com/2005/08/something-different-part-i-if-iii.html) 문제가 발생할 수 있습니다. – abhi

답변

0

소스 코드를 보지 않고 우리는 단지 추측 할 것입니다. 생각할 수있는 가장 확실한 제안은 어떤 경우에는 예외가 발생하고 커밋까지는 도달하지 않는다는 것입니다. 또 다른 가능성은 실행 중에 실패 할 때 테이블에 잠금이 있다는 것입니다.

아마도 더 자세히 조사해 보려면 예외를 일부 테이블이나 파일에 쓰고 오류가 발생한 것을 확인하는 예외 처리기를 추가하는 것이 가장 좋습니다.

-- create a logging table 
create table tmp_error_log (timestamp timestamp(0), Error_test varchar2(1000)); 

-- add a variable to your procedure declaration 
v_sql  varchar2(1000); 

-- add an exception handler just before the final end; statement on your procedure 
exception 
    when others then 
    begin 
     v_sql := 'insert into tmp_error_log values(''' || 
       to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS') || ''', ''' || SQLERRM || ''')'; 
     dbms_output.put_line(v_sql); 
     execute immediate v_sql; 
     commit; 
    end; 

-- see what you get in the table 
select * from tmp_error_log; 
관련 문제